1*4d6fc14bSjoerg #ifndef BENCHMARK_LOG_H_ 2*4d6fc14bSjoerg #define BENCHMARK_LOG_H_ 3*4d6fc14bSjoerg 4*4d6fc14bSjoerg #include <iostream> 5*4d6fc14bSjoerg #include <ostream> 6*4d6fc14bSjoerg 7*4d6fc14bSjoerg #include "benchmark/benchmark.h" 8*4d6fc14bSjoerg 9*4d6fc14bSjoerg namespace benchmark { 10*4d6fc14bSjoerg namespace internal { 11*4d6fc14bSjoerg 12*4d6fc14bSjoerg typedef std::basic_ostream<char>&(EndLType)(std::basic_ostream<char>&); 13*4d6fc14bSjoerg 14*4d6fc14bSjoerg class LogType { 15*4d6fc14bSjoerg friend LogType& GetNullLogInstance(); 16*4d6fc14bSjoerg friend LogType& GetErrorLogInstance(); 17*4d6fc14bSjoerg 18*4d6fc14bSjoerg // FIXME: Add locking to output. 19*4d6fc14bSjoerg template <class Tp> 20*4d6fc14bSjoerg friend LogType& operator<<(LogType&, Tp const&); 21*4d6fc14bSjoerg friend LogType& operator<<(LogType&, EndLType*); 22*4d6fc14bSjoerg 23*4d6fc14bSjoerg private: LogType(std::ostream * out)24*4d6fc14bSjoerg LogType(std::ostream* out) : out_(out) {} 25*4d6fc14bSjoerg std::ostream* out_; 26*4d6fc14bSjoerg BENCHMARK_DISALLOW_COPY_AND_ASSIGN(LogType); 27*4d6fc14bSjoerg }; 28*4d6fc14bSjoerg 29*4d6fc14bSjoerg template <class Tp> 30*4d6fc14bSjoerg LogType& operator<<(LogType& log, Tp const& value) { 31*4d6fc14bSjoerg if (log.out_) { 32*4d6fc14bSjoerg *log.out_ << value; 33*4d6fc14bSjoerg } 34*4d6fc14bSjoerg return log; 35*4d6fc14bSjoerg } 36*4d6fc14bSjoerg 37*4d6fc14bSjoerg inline LogType& operator<<(LogType& log, EndLType* m) { 38*4d6fc14bSjoerg if (log.out_) { 39*4d6fc14bSjoerg *log.out_ << m; 40*4d6fc14bSjoerg } 41*4d6fc14bSjoerg return log; 42*4d6fc14bSjoerg } 43*4d6fc14bSjoerg LogLevel()44*4d6fc14bSjoerginline int& LogLevel() { 45*4d6fc14bSjoerg static int log_level = 0; 46*4d6fc14bSjoerg return log_level; 47*4d6fc14bSjoerg } 48*4d6fc14bSjoerg GetNullLogInstance()49*4d6fc14bSjoerginline LogType& GetNullLogInstance() { 50*4d6fc14bSjoerg static LogType log(nullptr); 51*4d6fc14bSjoerg return log; 52*4d6fc14bSjoerg } 53*4d6fc14bSjoerg GetErrorLogInstance()54*4d6fc14bSjoerginline LogType& GetErrorLogInstance() { 55*4d6fc14bSjoerg static LogType log(&std::clog); 56*4d6fc14bSjoerg return log; 57*4d6fc14bSjoerg } 58*4d6fc14bSjoerg GetLogInstanceForLevel(int level)59*4d6fc14bSjoerginline LogType& GetLogInstanceForLevel(int level) { 60*4d6fc14bSjoerg if (level <= LogLevel()) { 61*4d6fc14bSjoerg return GetErrorLogInstance(); 62*4d6fc14bSjoerg } 63*4d6fc14bSjoerg return GetNullLogInstance(); 64*4d6fc14bSjoerg } 65*4d6fc14bSjoerg 66*4d6fc14bSjoerg } // end namespace internal 67*4d6fc14bSjoerg } // end namespace benchmark 68*4d6fc14bSjoerg 69*4d6fc14bSjoerg // clang-format off 70*4d6fc14bSjoerg #define VLOG(x) \ 71*4d6fc14bSjoerg (::benchmark::internal::GetLogInstanceForLevel(x) << "-- LOG(" << x << "):" \ 72*4d6fc14bSjoerg " ") 73*4d6fc14bSjoerg // clang-format on 74*4d6fc14bSjoerg #endif 75