]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Log.hh
port new sockets stuff to winsock
[chaz/yoink] / src / Moof / Log.hh
index d3aa555aac4c5fa4b81076de90a595612ca28883..c09ac017690600fb302cb79a382a5ef55b24750e 100644 (file)
@@ -1,47 +1,32 @@
 
-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
- Redistribution   and   use  in  source  and  binary  forms,  with  or  without
- modification, are permitted provided that the following conditions are met:
-   * Redistributions  of  source  code  must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
-   * Redistributions  in binary form must reproduce the above copyright notice,
-     this  list of conditions and the following disclaimer in the documentation
-     and/or other materials provided with the distribution.
- THIS  SOFTWARE  IS  PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND  ANY  EXPRESS  OR  IMPLIED  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED.  IN  NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES  (INCLUDING,  BUT  NOT  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES;  LOSS  OF  USE,  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED  AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-*******************************************************************************/
+/*]  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
+ * \file Log.h
  * Functions related to logging the process.
- * The logging functions are logError(), logWarning(), logInfo(), and
- * logDebug(), listed from most critical to least critical.
+ * The logging functions are logError(), logWarning(), and logInfo(),
+ * listed from most critical to least critical.
  */
 
 #include <cstdlib>             // exit
+#include <iostream>
 
 
 /**
- * Macro which tests an assertion and issues an logError() and exits if false.
- * @param X test to perform
+ * Macro which tests an assertion and issues a logError() and exits if the
+ * assertion is false.
+ * \param X test to perform
  */
 
 #undef ASSERT
@@ -49,8 +34,9 @@
 #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
 
 
@@ -58,68 +44,121 @@ 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()
+ * 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.
  */
-
-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:
+
+       /**
+        * A type for the level or priority of a log message.
+        */
+       enum Level
+       {
+               NONE            = 0,            ///< Disable all logging.
+               ERRORR          = 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 setLevel(Level level);
+
+       /**
+        * Get the current lowest-priority log level.  If unchanged, the
+        * default level is INFO.
+        * \return The log level.
+        */
+       static Level level();
+
+
+       /**
+        * 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(Level level, const char* prefix) :
+               mLevel(level),
+               mPrefix(prefix) /* only pass literal strings */ {}
+
+
+       template <class A>
+       void operator () (const A& a)
+       {
+               *this << a << std::endl;
+       }
+
+       template <class A, class B>
+       void operator () (const A& a, const B& b)
+       {
+               *this << a << " " << b << std::endl;
+       }
+
+       template <class A, class B, class C>
+       void operator () (const A& a, const B& b, const C& c)
+       {
+               *this << a << " " << b << " " << c << std::endl;
+       }
+
+       template <class A, class B, class C, class D>
+       void operator () (const A& a, const B& b, const C& c, const D& d)
+       {
+               *this << a << " " << b << " " << c << " " << d << std::endl;
+       }
+
+       template <class A, class B, class C, class D, class E>
+       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 <class T> friend std::ostream& operator << (Log&, const T&);
+
+       static Level    gLevel;
+
+       Level                   mLevel;
+       const char*             mPrefix;
 };
 
 
-/**
- * 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 an error.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
-
-void logError(const char* fmt, ...);
-
-/**
- * Log a warning.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+extern std::ostream&   log;
+extern std::ostream&   nullLog;
 
-void logWarning(const char* fmt, ...);
+extern Log logError;
+extern Log logWarning;
+extern Log logInfo;
 
-/**
- * Log a message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
 
-void logInfo(const char* fmt, ...);
-
-/**
- * Log a debug message.
- * @param fmt Log format string.
- * @param ... Extra format arguments.
- */
+template <class T>
+inline std::ostream& operator << (Log& logObj, const T& item)
+{
+       if (Log::gLevel < logObj.mLevel) return nullLog;
+       return log << logObj.mPrefix << item;
+}
 
-void logDebug(const char* fmt, ...);
 
-void logScript(const char* fmt, ...);
 class Script;
-int logScript(Script& script);
-void importLogPrintFunction(Script& script);
+void importLogFunctions(Script& script);
 
 
 } // namespace Mf
This page took 0.024098 seconds and 4 git commands to generate.