X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2Fmoof%2Flog.hh;fp=src%2Fmoof%2Flog.hh;h=2679b37306694763e1b0886a904a660f549f5fff;hp=0000000000000000000000000000000000000000;hb=831f04d4bc19a390415ac0bbac4331c7a65509bc;hpb=299af4f2047e767e5d79501c26444473bda64c64 diff --git a/src/moof/log.hh b/src/moof/log.hh new file mode 100644 index 0000000..2679b37 --- /dev/null +++ b/src/moof/log.hh @@ -0,0 +1,171 @@ + +/*] 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_HH_ +#define _MOOF_LOG_HH_ + +/** + * \file log.hh + * Functions related to logging the process. + * The logging functions are log_error(), log_warning(), and log_info(), + * listed from most critical to least critical. + */ + +#include // exit +#include + + +#undef ASSERT +#if NDEBUG +#define ASSERT(X) +#else +/** + * Macro which tests an assertion and issues a log_error() and exits if the + * assertion is false. + * \param X test to perform + */ +#define ASSERT(X) if (!(X)) moof::log_error \ + << "false assertion at " << __FILE__ << ":" << __LINE__ << ", " \ + << #X, exit(1) +#endif + + +namespace moof { + + +class script; + + +/** + * A class for handling a log priority. There are two ways to log + * messages: by treating a log object as a function whose parameters are + * printed with default spacing, or by treating a log object as an output + * stream. Either way, any object can be printed to the log as long as + * there is an override for the ostream insertion operator. + */ +class log +{ +public: + + /** + * A type for the level or priority of a log message. + */ + enum level + { + none = 0, ///< Disable all logging. + error = 1, ///< Log only errors. + warning = 2, ///< Log warnings and errors. + info = 3, ///< Log everything. + }; + + + /** + * Set the lowest-priority log message that will be outputted to the + * log. Any logging with a lower priority will be ignored. + * \param level The log level. + */ + static void level(level level); + + /** + * Get the current lowest-priority log level. If unchanged, the + * default level is info. + * \return The log level. + */ + static enum level level(); + + + /** + * Import log functions to a script. + * \param The script. + */ + static void import(script& script); + + + /** + * Construct a log with a certain priority and prefix string. + * \param level The log level. + * \param prefix The string printed before each log message. + */ + log(enum level level, const char* prefix) : + level_(level), + prefix_(prefix) /* only pass literal strings */ {} + + + template + void operator () (const A& a) + { + *this << a << std::endl; + } + + template + void operator () (const A& a, const B& b) + { + *this << a << " " << b << std::endl; + } + + template + void operator () (const A& a, const B& b, const C& c) + { + *this << a << " " << b << " " << c << std::endl; + } + + template + void operator () (const A& a, const B& b, const C& c, const D& d) + { + *this << a << " " << b << " " << c << " " << d << std::endl; + } + + template + void operator () (const A& a, + const B& b, + const C& c, + const D& d, + const E& e) + { + *this << a << " " + << b << " " + << c << " " + << d << " " + << e << std::endl; + } + + +private: + + template friend std::ostream& operator << (log&, const T&); + + static enum level gLevel; + + enum level level_; + const char* prefix_; +}; + + +extern std::ostream& log; +extern std::ostream& null_log; + +extern class log log_error; +extern class log log_warning; +extern class log log_info; + + +template +inline std::ostream& operator << (class log& log, const T& item) +{ + if (log::gLevel < log.level_) return null_log; + return moof::log << log.prefix_ << item; +} + + +} // namespace moof + +#endif // _MOOF_LOG_HH_ +