Index: third_party/google_benchmark/src/log.h |
diff --git a/third_party/google_benchmark/src/log.h b/third_party/google_benchmark/src/log.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..978cb0b4c8cbebb85d9e654489bef0f9b18a05d4 |
--- /dev/null |
+++ b/third_party/google_benchmark/src/log.h |
@@ -0,0 +1,73 @@ |
+#ifndef BENCHMARK_LOG_H_ |
+#define BENCHMARK_LOG_H_ |
+ |
+#include <iostream> |
+#include <ostream> |
+ |
+#include "benchmark/macros.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 |