]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Log.hh
included manager class
[chaz/yoink] / src / Moof / Log.hh
index 3f6b6d7e45013b8360af975288d03082c6ed0d91..96585a1d5dc0041c7deea6b4027dd69eff9eb056 100644 (file)
@@ -37,7 +37,7 @@
  */
 
 #include <cstdlib>             // exit
-#include <cstring>             // strerror
+#include <iostream>
 
 
 /**
  * @param X test to perform
  */
 
-#if ! NDEBUG
-#define ASSERT(X) if (!(X)) Mf::logError("false assertion at %s:%d, " #X, \
-               __FILE__, __LINE__), exit(1)
-#else
+#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 {
 
 
-/**
- * Possible values used for setting the log level using LogLevel().  Log
- * messages of lesser importance than the level specified are ignored.
- * @see LogLevel()
- */
+class Log
+{
+public:
 
-typedef enum {
-       NONE            = -1,           ///< Disable all logging.
-       ERROR           =  1,           ///< Log only errors.
-       WARNING         =  2,           ///< Log warnings and errors.
-       INFO            =  3,           ///< Log info, warnings, errors.
-       DEBUGGING       =  4            ///< Log all messages.
-} LogLevel;
+       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();
 
-/**
- * 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.
- */
 
-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.
- */
+       template <typename T>
+       void operator () (const T& item)
+       {
+               *this << item << std::endl;
+       }
 
-void logError(const char* fmt, ...);
+private:
 
-/**
- * Log a warning.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+       template <typename T> friend std::ostream& operator << (Log&, const T&);
 
-void logWarning(const char* fmt, ...);
+       static Level    gLevel;
 
-/**
- * Log a message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+       Level                   mLevel;
+       const char*             mType;
+};
 
-void logInfo(const char* fmt, ...);
 
-/**
- * Log a debug message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+extern std::ostream&   log;
+extern std::ostream&   nullLog;
+
+extern Log logError;
+extern Log logWarning;
+extern Log logInfo;
+
+
+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 logDebug(const char* fmt, ...);
+class Script;
+void importLogFunctions(Script& script);
 
 
 } // namespace Mf
This page took 0.023504 seconds and 4 git commands to generate.