/*] Copyright (c) 2009-2010, Charles McGarvey [************************** **] All rights reserved. * * vi:ts=4 sw=4 tw=75 * * Distributable under the terms and conditions of the 2-clause BSD license; * see the file COPYING for a complete text of the license. * **************************************************************************/ #ifndef _MOOF_LOG_H_ #define _MOOF_LOG_H_ /** * @file log.h * Functions related to logging the process. * The logging functions are logError(), logWarning(), and logInfo(), * listed from most critical to least critical. */ #include // exit #include /** * Macro which tests an assertion and issues an logError() and exits if * false. * @param X test to perform */ #undef ASSERT #if NDEBUG #define ASSERT(X) #else #define ASSERT(X) if (!(X)) Mf::logError \ << "false assertion at " << __FILE__ << ":" << __LINE__ << ", " \ << #X, exit(1) #endif namespace Mf { class Log { public: enum Level { NONE = 0, ///< Disable all logging. ERRORR = 1, ///< Log only errors. WARNING = 2, ///< Log warnings and errors. INFO = 3, ///< Log everything. }; static void setLevel(Level level); static Level getLevel(); Log(Level level, const char* type) : mLevel(level), mType(type) /* only pass literal strings */ {} template void operator () (const T& item) { *this << item << std::endl; } private: template friend std::ostream& operator << (Log&, const T&); static Level gLevel; Level mLevel; const char* mType; }; extern std::ostream& log; extern std::ostream& nullLog; extern Log logError; extern Log logWarning; extern Log logInfo; template inline std::ostream& operator << (Log& logObj, const T& item) { if (Log::gLevel < logObj.mLevel) return nullLog; return log << logObj.mType << item; } class Script; void importLogFunctions(Script& script); } // namespace Mf #endif // _MOOF_LOG_H_