]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Log.hh
included manager class
[chaz/yoink] / src / Moof / Log.hh
index d3e4009c4a5a43f59393a8302922e9995f12bea0..96585a1d5dc0041c7deea6b4027dd69eff9eb056 100644 (file)
  */
 
 #include <cstdlib>             // exit
-#include <cerrno>              // errno
-#include <cstring>             // strerror
-
-
-namespace Mf {
+#include <iostream>
 
 
 /**
  * Macro which tests an assertion and issues an logError() and exits if false.
- * This differs from the standard assert() in that this is a runtime assertion
- * test and will always be compiled in.
  * @param X test to perform
  */
 
-#define ASSERT(X) if (!(X)) logError("false assertion at %s:%d, " #X \
-               " (errno: %d, %s)", __FILE__, __LINE__, errno, strerror(errno)), exit(1)
+#undef ASSERT
 
+#if NDEBUG
+#define ASSERT(X)
+#else
+#define ASSERT(X) if (!(X)) Mf::logError << \
+       "false assertion at " << __FILE__ << ":" << __LINE__ << ", " << #X, exit(1)
+#endif
 
-/**
- * Possible values used for setting the log level using LogLevel().  Log
- * messages of lesser importance than the level specified are ignored.
- * @see LogLevel()
- */
 
-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;
+namespace Mf {
 
 
-/**
- * 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.
- */
+class Log
+{
+public:
 
-LogLevel setLogLevel(LogLevel level);
+       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 an error.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logError(const char* fmt, ...);
+       Log(Level level, const char* type) :
+               mLevel(level),
+               mType(type) /* only pass literal strings */ {}
 
-/**
- * Log a warning.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logWarning(const char* fmt, ...);
+       template <typename T>
+       void operator () (const T& item)
+       {
+               *this << item << std::endl;
+       }
 
-/**
- * Log a message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+private:
 
-void logInfo(const char* fmt, ...);
+       template <typename T> 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 <typename T>
+inline std::ostream& operator << (Log& logObj, const T& item)
+{
+       if (Log::gLevel < logObj.mLevel) return nullLog;
+       return log << logObj.mType << item;
+}
 
-/**
- * Log a debug message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logDebug(const char* fmt, ...);
+class Script;
+void importLogFunctions(Script& script);
 
 
 } // namespace Mf
This page took 0.022794 seconds and 4 git commands to generate.