From 84921f4d0b36399ab029850c8316ea02e35ca128 Mon Sep 17 00:00:00 2001 From: Daviw Williams Date: Wed, 29 Jan 2014 16:53:11 +0100 Subject: [PATCH 1/2] The existing logging code is rather large and overwhelming. I'm starting to replace it with a simpler system that should also be easier to maintain. --- .../include/PolyVoxCore/Impl/Logging.h | 50 +++++++++++++++++-- library/PolyVoxCore/source/Impl/Logging.cpp | 16 ++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h b/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h index ce3f5946..4226f2e6 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h +++ b/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h @@ -35,12 +35,54 @@ freely, subject to the following restrictions: * PolyVox provides basic logging facilities which can be redirected by your application. */ -#define LOG_DECLARATION(name) \ - std::ostream& log(name)(void); \ - void set(name)Stream(std::ostream& nameStream); - namespace PolyVox { + class Logger + { + public: + // Passing zero to the null stream constructor guarentees it will discard all input. See + // here http://stackoverflow.com/a/8244052 and here http://stackoverflow.com/a/6240980 + Logger() : m_NullStream(0) {}; + virtual ~Logger() {}; + + virtual std::ostream& getTraceStream() = 0; + virtual std::ostream& getDebugStream() = 0; + virtual std::ostream& getInfoStream() = 0; + virtual std::ostream& getWarningStream() = 0; + virtual std::ostream& getErrorStream() = 0; + virtual std::ostream& getFatalStream() = 0; + + protected: + std::ostream& getNullStream() + { + return m_NullStream; + } + + private: + std::ostream m_NullStream; + }; + + class DefaultLogger : Logger + { + public: + DefaultLogger() : Logger() {} + virtual ~DefaultLogger() {} + + std::ostream& getTraceStream() { return getNullStream(); } + std::ostream& getDebugStream() { return getNullStream(); } + std::ostream& getInfoStream() { return (std::cout); } + std::ostream& getWarningStream() { return (std::cerr); } + std::ostream& getErrorStream() { return (std::cerr); } + std::ostream& getFatalStream() { return (std::cerr); } + }; + + namespace Impl + { + Logger*& getLoggerInstance(); + } + + void setLogger(Logger* pLogger); + namespace Impl { std::ostream*& getTraceStreamInstance(); diff --git a/library/PolyVoxCore/source/Impl/Logging.cpp b/library/PolyVoxCore/source/Impl/Logging.cpp index 2dc3f046..31af87c7 100644 --- a/library/PolyVoxCore/source/Impl/Logging.cpp +++ b/library/PolyVoxCore/source/Impl/Logging.cpp @@ -25,6 +25,22 @@ freely, subject to the following restrictions: namespace PolyVox { + namespace Impl + { + // Perhaps read this note when we want to move everything + // to the header file: http://stackoverflow.com/a/7834555 + Logger*& getLoggerInstance() + { + static Logger* s_pLogger = 0; + return s_pLogger; + } + } + + void setLogger(Logger* pLogger) + { + Impl::getLoggerInstance() = pLogger; + } + /** * \return A pointer to the null stream. */ From f4e03cc5370492ab02e8ae5378af55c30c5aaa79 Mon Sep 17 00:00:00 2001 From: David Williams Date: Wed, 29 Jan 2014 21:29:00 +0100 Subject: [PATCH 2/2] Macros now call new logging system instead of the old one. --- .../include/PolyVoxCore/Impl/Logging.h | 26 +++++++++---------- library/PolyVoxCore/source/Impl/Logging.cpp | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h b/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h index 4226f2e6..54491825 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h +++ b/library/PolyVoxCore/include/PolyVoxCore/Impl/Logging.h @@ -62,7 +62,7 @@ namespace PolyVox std::ostream m_NullStream; }; - class DefaultLogger : Logger + class DefaultLogger : public Logger { public: DefaultLogger() : Logger() {} @@ -201,7 +201,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getTraceStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getTraceStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -216,7 +216,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getTraceStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getTraceStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -254,7 +254,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getDebugStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getDebugStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -269,7 +269,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getDebugStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getDebugStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -307,7 +307,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getInfoStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getInfoStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -322,7 +322,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getInfoStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getInfoStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -360,7 +360,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getWarningStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getWarningStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -375,7 +375,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getWarningStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getWarningStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -413,7 +413,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getErrorStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getErrorStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -428,7 +428,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getErrorStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getErrorStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -466,7 +466,7 @@ namespace PolyVox do \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getFatalStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getFatalStream()) << message << std::endl; \ } while(0) \ POLYVOX_MSC_WARNING_POP @@ -481,7 +481,7 @@ namespace PolyVox if ((condition)) \ { \ /* Appending the 'std::endl' forces the stream to be flushed. */ \ - *(PolyVox::Impl::getFatalStreamInstance()) << message << std::endl; \ + (PolyVox::Impl::getLoggerInstance()->getFatalStream()) << message << std::endl; \ } \ } while(0) \ POLYVOX_MSC_WARNING_POP diff --git a/library/PolyVoxCore/source/Impl/Logging.cpp b/library/PolyVoxCore/source/Impl/Logging.cpp index 31af87c7..f055f40c 100644 --- a/library/PolyVoxCore/source/Impl/Logging.cpp +++ b/library/PolyVoxCore/source/Impl/Logging.cpp @@ -31,7 +31,7 @@ namespace PolyVox // to the header file: http://stackoverflow.com/a/7834555 Logger*& getLoggerInstance() { - static Logger* s_pLogger = 0; + static Logger* s_pLogger = new DefaultLogger; return s_pLogger; } }