|  | #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 | 
|  |  | 
|  | // clang-format off | 
|  | #define VLOG(x)                                                               \ | 
|  | (::benchmark::internal::GetLogInstanceForLevel(x) << "-- LOG(" << x << "):" \ | 
|  | " ") | 
|  | // clang-format on | 
|  | #endif |