xref: /netbsd-src/external/apache2/llvm/dist/libcxx/utils/google-benchmark/src/log.h (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
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*4d6fc14bSjoerg inline int& LogLevel() {
45*4d6fc14bSjoerg   static int log_level = 0;
46*4d6fc14bSjoerg   return log_level;
47*4d6fc14bSjoerg }
48*4d6fc14bSjoerg 
GetNullLogInstance()49*4d6fc14bSjoerg inline LogType& GetNullLogInstance() {
50*4d6fc14bSjoerg   static LogType log(nullptr);
51*4d6fc14bSjoerg   return log;
52*4d6fc14bSjoerg }
53*4d6fc14bSjoerg 
GetErrorLogInstance()54*4d6fc14bSjoerg inline LogType& GetErrorLogInstance() {
55*4d6fc14bSjoerg   static LogType log(&std::clog);
56*4d6fc14bSjoerg   return log;
57*4d6fc14bSjoerg }
58*4d6fc14bSjoerg 
GetLogInstanceForLevel(int level)59*4d6fc14bSjoerg inline 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