]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Log.hh
stream-based logging classes
[chaz/yoink] / src / Moof / Log.hh
index d3aa555aac4c5fa4b81076de90a595612ca28883..c7ee50726b68e35ea914b81afa9c95fc4c347687 100644 (file)
@@ -37,6 +37,7 @@
  */
 
 #include <cstdlib>             // exit
+#include <iostream>
 
 
 /**
 #if NDEBUG
 #define ASSERT(X)
 #else
-#define ASSERT(X) if (!(X)) Mf::logError("false assertion at %s:%d, " #X, \
-               __FILE__, __LINE__), exit(1)
+#define ASSERT(X) if (!(X)) Mf::logError << \
+       "false assertion at " << __FILE__ << ":" << __LINE__ << ", " << #X, exit(1)
 #endif
 
 
 namespace Mf {
 
 
-/**
- * Possible values used for setting the log level using LogLevel().  Log
- * messages of lesser importance than the level specified are ignored.
- * @see LogLevel()
- */
-
-enum LogLevel
+class Log
 {
-       LOG_NONE                = -1,           ///< Disable all logging.
-       LOG_ERROR               =  1,           ///< Log only errors.
-       LOG_WARNING             =  2,           ///< Log warnings and errors.
-       LOG_SCRIPT              =  3,           ///< Log messages from Lua, too.
-       LOG_INFO                =  4,           ///< Log info, warnings, errors.
-       LOG_DEBUG               =  5,           ///< Log all messages.
-};
+public:
 
+       enum Level
+       {
+               NONE            = -1,           ///< Disable all logging.
+               ERRORR          =  1,           ///< Log only errors.
+               WARNING         =  2,           ///< Log warnings and errors.
+               SCRIPT          =  3,           ///< Log messages from Lua, too.
+               INFO            =  4,           ///< Log info, warnings, errors.
+               DEBUGG          =  5,           ///< Log all messages.
+       };
 
-/**
- * Set and/or get the level of logs which will be logged.  If not called,
- * defaults to WARNING
- * @param level LOG_LEVEL_* constant or 0 for no change.
- * @return The currently set log level.
- */
+       static void setLevel(Level level);
+       static Level getLevel();
 
-LogLevel setLogLevel(LogLevel level);
 
+       Log(Level level, const char* type) :
+               mLevel(level),
+               mType(type) /* only pass literal strings */ {}
 
-/**
- * Log an error.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logError(const char* fmt, ...);
+       template <typename T>
+       void operator () (const T& item)
+       {
+               *this << item << std::endl;
+       }
 
-/**
- * Log a warning.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+private:
 
-void logWarning(const char* fmt, ...);
+       template <typename T> friend std::ostream& operator << (Log&, const T&);
 
-/**
- * Log a message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+       static Level    gLevel;
 
-void logInfo(const char* fmt, ...);
+       Level                   mLevel;
+       const char*             mType;
+};
 
-/**
- * Log a debug message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logDebug(const char* fmt, ...);
+extern std::ostream&   log;
+extern std::ostream&   nullLog;
+
+extern Log logError;
+extern Log logWarning;
+extern Log logInfo;
+extern Log logDebug;
+
+
+template <typename T>
+inline std::ostream& operator << (Log& logObj, const T& item)
+{
+       if (Log::gLevel < logObj.mLevel) return nullLog;
+       return log << logObj.mType << item;
+}
+
 
-void logScript(const char* fmt, ...);
 class Script;
-int logScript(Script& script);
 void importLogPrintFunction(Script& script);
 
 
This page took 0.021154 seconds and 4 git commands to generate.