///////////////////////////////////////////////////////////////////////////
//
// Copyright 2010
//
// This file is part of starlight.
//
// starlight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// starlight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with starlight. If not, see .
//
///////////////////////////////////////////////////////////////////////////
//
// File and Version Information:
// $Rev:: 29 $: revision of last commit
// $Author:: bgrube $: author of last commit
// $Date:: 2010-12-30 20:05:42 +0100 #$: date of last commit
//
// Description:
// some simple streams for reporting plus some stream operators
// for common STL classes
//
//
///////////////////////////////////////////////////////////////////////////
#ifndef REPORTINGUTILS_H
#define REPORTINGUTILS_H
#include
#include
#include
#include
//////////////////////////////////////////////////////////////////////////////
// macros for printing errors, warnings, and infos
// cuts out block "className::methodName" from __PRETTY_FUNCTION__ output
inline
std::string
getClassMethod__(std::string prettyFunction)
{
size_t pos = prettyFunction.find("(");
if (pos == std::string::npos)
return prettyFunction; // something is not right
prettyFunction.erase(pos); // cut away signature
pos = prettyFunction.rfind(" ");
if (pos == std::string::npos)
return prettyFunction; // something is not right
prettyFunction.erase(0, pos + 1); // cut away return type
return prettyFunction;
}
#define printErr std::cerr << "!!! " << __PRETTY_FUNCTION__ << " [" << __FILE__ << ":" << __LINE__ << "]: error: " << std::flush
#define printWarn std::cerr << "??? " << __PRETTY_FUNCTION__ << " [" << __FILE__ << ":" << __LINE__ << "]: warning: " << std::flush
#define printInfo std::cout << ">>> " << getClassMethod__(__PRETTY_FUNCTION__) << "(): info: " << std::flush
//////////////////////////////////////////////////////////////////////////////
// functions to print version and compilation info
#ifndef SVN_VERSION // SVN_VERSION set by Makefile
#define SVN_VERSION "undefined"
#endif
inline std::string svnVersion() { return SVN_VERSION; }
inline
void
printSvnVersion()
{
const std::string ver = svnVersion();
if (ver == "")
printInfo << "subversion repository revision is unknown." << std::endl;
else
printInfo << "subversion repository revision is '" << ver << "'" << std::endl;
}
#ifndef CMAKE_SOURCE_DIR // CMAKE_SOURCE_DIR set by Makefile
#define CMAKE_SOURCE_DIR "undefined"
#endif
inline std::string compileDir() { return CMAKE_SOURCE_DIR; }
inline
void
printCompilerInfo()
{
const std::string date = __DATE__;
const std::string time = __TIME__;
const std::string ver = __VERSION__;
const std::string dir = compileDir();
printInfo << "this executable was compiled in ";
if (dir != "")
std::cout << "'" << dir << "'";
else
std::cout << "unknown directory";
std::cout << " on " << date << " " << time << " by compiler " << ver << std::endl;
}
//////////////////////////////////////////////////////////////////////////////
// simple stream operators for some STL classes
template
inline
std::ostream&
operator << (std::ostream& out,
const std::pair& pair)
{
return out << "(" << pair.first << ", " << pair.second << ")";
}
template
inline
std::ostream&
operator << (std::ostream& out,
const std::vector& vec)
{
out << "{";
for (unsigned int i = 0; i < (vec.size() - 1); ++i)
out << "[" << i << "] = " << vec[i] << ", ";
return out << "[" << vec.size() - 1 << "] = " << vec[vec.size() - 1] << "}";
}
//////////////////////////////////////////////////////////////////////////////
// various stuff
// indicates progess by printing relative or absolute progress in regular intervals
inline
std::ostream&
progressIndicator(const unsigned int currentPos,
const unsigned int nmbTotal,
const bool absolute = false,
const unsigned int fieldWidth = 3,
const unsigned int nmbSteps = 10,
std::ostream& out = std::cout)
{
const double step = nmbTotal / (double)nmbSteps;
if ((int)(currentPos / step) - (int)((currentPos - 1) / step) != 0) {
if (absolute)
out << " " << std::setw(fieldWidth) << currentPos << " of " << nmbTotal << std::endl;
else
out << " " << std::setw(fieldWidth) << (int)(currentPos / step) * nmbSteps << " %" << std::endl;
}
return out;
}
// converts bool to "true"/"false" string
inline
std::string trueFalse(const bool val)
{
if (val)
return "true";
else
return "false";
}
// converts bool to "yes"/"no" string
inline
std::string yesNo(const bool val)
{
if (val)
return "yes";
else
return "no";
}
// converts bool to "on"/"off" string
inline
std::string onOff(const bool val)
{
if (val)
return "on";
else
return "off";
}
// converts bool to "enabled"/"disabled" string
inline
std::string enDisabled(const bool val)
{
if (val)
return "enabled";
else
return "disabled";
}
#endif // REPORTINGUTILS_H