From e4d70a9ad91aa129ede30c22f1f651fd95592a29 Mon Sep 17 00:00:00 2001 From: Jorge Gorbe Moya Date: Mon, 16 Jun 2008 15:39:09 +0200 Subject: [PATCH] New logger --- Logger.cc | 4 --- Logger.h | 72 +++++++++++++++++++++++++++++++++++++++-------------- Makefile | 11 +++----- Singleton.h | 23 +++++++++++++++++ 4 files changed, 80 insertions(+), 30 deletions(-) delete mode 100644 Logger.cc create mode 100644 Singleton.h diff --git a/Logger.cc b/Logger.cc deleted file mode 100644 index 93bcd3f..0000000 --- a/Logger.cc +++ /dev/null @@ -1,4 +0,0 @@ -#include "Logger.h" -#include - -Logger Logger::instance(std::cerr); diff --git a/Logger.h b/Logger.h index 8d0138a..123e1f4 100644 --- a/Logger.h +++ b/Logger.h @@ -3,14 +3,12 @@ #include #include +#include #include +#include "Singleton.h" -class Logger +class Logger: public Singleton { - private: - std::ostream& out; - static Logger instance; - public: enum log_level{ OFF = -1, @@ -22,30 +20,66 @@ class Logger TRACE=5 }; - static Logger& getInstance() { return instance; } - Logger(std::ostream& os): - out(os), - current_log_level(TRACE) {} - - log_level current_log_level; + Logger(): + out(std::cerr), + current_log_level(TRACE), + log_start_time(time(NULL)) + { + //log_start_time = time(NULL); + out << "Starting log at " << static_cast(log_start_time) << std::endl; + } + //void setOutput(std::ostream os) { out = os; } void log(log_level level, std::string str) { if (level <= current_log_level) - out << "[" << time(NULL) << "] " << str << std::endl; + out << "[" << difftime(time(NULL), log_start_time) << "] " << str << std::endl; } + + #define LOGFUNC1(func, tag) template void func(T1 p1) \ + { std::stringstream str; str << p1; log(tag, str.str()); } + #define LOGFUNC2(func, tag) template void func(T1 p1, T2 p2) \ + { std::stringstream str; str << p1 << p2; log(tag, str.str()); } + #define LOGFUNC3(func, tag) template \ + void func(T1 p1, T2 p2, T3 p3) \ + { std::stringstream str; str << p1 << p2 << p3; log(tag, str.str()); } + #define LOGFUNC4(func, tag) template \ + void func(T1 p1, T2 p2, T3 p3, T4 p4) \ + { std::stringstream str; str << p1 << p2 << p3 << p4; log(tag, str.str()); } + #define LOGFUNC5(func, tag) template \ + void func(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) \ + { std::stringstream str; str << p1 << p2 << p3 << p4 << p5; log(tag, str.str()); } + #define LOGFUNC6(func, tag) template \ + void func(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) \ + { std::stringstream str; str << p1 << p2 << p3 << p4 << p5 << p6; log(tag, str.str()); } + #define LOGFUNC7(func, tag) template \ + void func(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) \ + { std::stringstream str; str << p1 << p2 << p3 << p4 << p5 << p6 << p7; log(tag, str.str()); } + + #define LOGFUNC(func, tag) \ + LOGFUNC1(func, tag) \ + LOGFUNC2(func, tag) \ + LOGFUNC3(func, tag) \ + LOGFUNC4(func, tag) \ + LOGFUNC5(func, tag) \ + LOGFUNC6(func, tag) \ + LOGFUNC7(func, tag) - void critical(std::string str) { log(CRITICAL, str); } - void error (std::string str) { log(ERROR , str); } - void warning (std::string str) { log(WARNING , str); } - void info (std::string str) { log(INFO , str); } - void debug (std::string str) { log(DEBUG , str); } - void trace (std::string str) { log(TRACE , str); } + LOGFUNC(critical, CRITICAL) + LOGFUNC(error, ERROR) + LOGFUNC(warning, WARNING) + LOGFUNC(info, INFO) + LOGFUNC(debug, DEBUG) + LOGFUNC(trace, TRACE) void set_log_level (log_level level) { current_log_level = level; } + private: + std::ostream& out; + log_level current_log_level; + time_t log_start_time; }; -#define logger Logger::getInstance() +#define logger Logger::Instance() #endif diff --git a/Makefile b/Makefile index d97beaf..71704cf 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,10 @@ CXXFLAGS=-g -Wall -Weffc++ -Wstrict-null-sentinel -Wold-style-cast \ -Woverloaded-virtual LDFLAGS=-g -all: gbcore.o MBC.o GBMemory.o Logger.o GBRom.o GBVideo.o +all: gbcore.o MBC.o GBMemory.o GBRom.o GBVideo.o tests: tests/test_gbrom tests/test_core -Logger.o: Logger.cc Logger.h - g++ $(CXXFLAGS) -c -o $@ $< - GBVideo.o: GBVideo.cc GBVideo.h Logger.h g++ $(CXXFLAGS) -c -o $@ $< @@ -21,10 +18,10 @@ MBC.o: MBC.cc MBC.h Logger.h gbcore.o: gbcore.cc gbcore.h GBRom.h Logger.h MBC.h GBMemory.h g++ $(CXXFLAGS) -c -o $@ $< -tests/test_gbrom: GBRom.cc GBRom.h Logger.o - g++ -DTEST_GBROM -o $@ GBRom.cc Logger.o +tests/test_gbrom: GBRom.cc GBRom.h + g++ -DTEST_GBROM -o $@ GBRom.cc -tests/test_core: tests/test_core.cc gbcore.o MBC.o GBMemory.o Logger.o GBRom.o +tests/test_core: tests/test_core.cc gbcore.o MBC.o GBMemory.o GBRom.o GBVideo.o g++ -o $@ $^ clean: diff --git a/Singleton.h b/Singleton.h new file mode 100644 index 0000000..e500f21 --- /dev/null +++ b/Singleton.h @@ -0,0 +1,23 @@ +// Meyers' singleton +// from http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pattern-Part-2/1/ +#if !defined(SINGLETON_H) +#define SINGLETON_H + +template +class Singleton +{ + public: + static T& Instance() + { + static T _instance; + return _instance; + } + + protected: + Singleton() {} // ctor hidden + virtual ~Singleton() {} // dtor hidden + Singleton(Singleton const&); // copy ctor hidden + Singleton& operator=(Singleton const&); // assign op hidden +}; + +#endif -- 2.34.1