• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_FML_LOGGING_H_
6 #define FLUTTER_FML_LOGGING_H_
7 
8 #include <sstream>
9 
10 #include "flutter/fml/log_level.h"
11 #include "flutter/fml/macros.h"
12 
13 namespace fml {
14 
15 class LogMessageVoidify {
16  public:
17   void operator&(std::ostream&) {}
18 };
19 
20 class LogMessage {
21  public:
22   LogMessage(LogSeverity severity,
23              const char* file,
24              int line,
25              const char* condition);
26   ~LogMessage();
27 
stream()28   std::ostream& stream() { return stream_; }
29 
30  private:
31   std::ostringstream stream_;
32   const LogSeverity severity_;
33   const char* file_;
34   const int line_;
35 
36   FML_DISALLOW_COPY_AND_ASSIGN(LogMessage);
37 };
38 
39 // Gets the FML_VLOG default verbosity level.
40 int GetVlogVerbosity();
41 
42 // Returns true if |severity| is at or above the current minimum log level.
43 // LOG_FATAL and above is always true.
44 bool ShouldCreateLogMessage(LogSeverity severity);
45 
46 }  // namespace fml
47 
48 #define FML_LOG_STREAM(severity) \
49   ::fml::LogMessage(::fml::LOG_##severity, __FILE__, __LINE__, nullptr).stream()
50 
51 #define FML_LAZY_STREAM(stream, condition) \
52   !(condition) ? (void)0 : ::fml::LogMessageVoidify() & (stream)
53 
54 #define FML_EAT_STREAM_PARAMETERS(ignored) \
55   true || (ignored)                        \
56       ? (void)0                            \
57       : ::fml::LogMessageVoidify() &       \
58             ::fml::LogMessage(::fml::LOG_FATAL, 0, 0, nullptr).stream()
59 
60 #define FML_LOG_IS_ON(severity) \
61   (::fml::ShouldCreateLogMessage(::fml::LOG_##severity))
62 
63 #define FML_LOG(severity) \
64   FML_LAZY_STREAM(FML_LOG_STREAM(severity), FML_LOG_IS_ON(severity))
65 
66 #define FML_CHECK(condition)                                              \
67   FML_LAZY_STREAM(                                                        \
68       ::fml::LogMessage(::fml::LOG_FATAL, __FILE__, __LINE__, #condition) \
69           .stream(),                                                      \
70       !(condition))
71 
72 #define FML_VLOG_IS_ON(verbose_level) \
73   ((verbose_level) <= ::fml::GetVlogVerbosity())
74 
75 // The VLOG macros log with negative verbosities.
76 #define FML_VLOG_STREAM(verbose_level) \
77   ::fml::LogMessage(-verbose_level, __FILE__, __LINE__, nullptr).stream()
78 
79 #define FML_VLOG(verbose_level) \
80   FML_LAZY_STREAM(FML_VLOG_STREAM(verbose_level), FML_VLOG_IS_ON(verbose_level))
81 
82 #ifndef NDEBUG
83 #define FML_DLOG(severity) FML_LOG(severity)
84 #define FML_DCHECK(condition) FML_CHECK(condition)
85 #else
86 #define FML_DLOG(severity) FML_EAT_STREAM_PARAMETERS(true)
87 #define FML_DCHECK(condition) FML_EAT_STREAM_PARAMETERS(condition)
88 #endif
89 
90 #define FML_NOTREACHED() FML_DCHECK(false)
91 
92 #define FML_NOTIMPLEMENTED() \
93   FML_LOG(ERROR) << "Not implemented in: " << __PRETTY_FUNCTION__
94 
95 #endif  // FLUTTER_FML_LOGGING_H_
96