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