Index: mojo/public/cpp/environment/logging.h |
diff --git a/mojo/public/cpp/environment/logging.h b/mojo/public/cpp/environment/logging.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a3e2cef42938c759c898e576b8dc54c1e980cbcf |
--- /dev/null |
+++ b/mojo/public/cpp/environment/logging.h |
@@ -0,0 +1,87 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Logging macros, similar to Chromium's base/logging.h, except with |MOJO_| |
+// prefixes and missing some features (notably |CHECK_EQ()|, etc.). |
+ |
+// TODO(vtl): It's weird that this is in the environment directory, since its |
+// implementation (in environment/lib) is meant to be used by any implementation |
+// of the environment. |
+ |
+#ifndef MOJO_PUBLIC_CPP_ENVIRONMENT_LOGGING_H_ |
+#define MOJO_PUBLIC_CPP_ENVIRONMENT_LOGGING_H_ |
+ |
+#include <sstream> |
+ |
+#include "mojo/public/c/environment/logger.h" |
+#include "mojo/public/cpp/environment/environment.h" |
+#include "mojo/public/cpp/system/macros.h" |
+ |
+#define MOJO_LOG_STREAM(level) \ |
+ ::mojo::internal::LogMessage(__FILE__, __LINE__, \ |
+ MOJO_LOG_LEVEL_ ## level).stream() |
+ |
+#define MOJO_LAZY_LOG_STREAM(level, condition) \ |
+ !(condition) ? \ |
+ (void) 0 : \ |
+ ::mojo::internal::VoidifyOstream() & MOJO_LOG_STREAM(level) |
+ |
+#define MOJO_SHOULD_LOG(level) \ |
+ (MOJO_LOG_LEVEL_ ## level >= \ |
+ ::mojo::Environment::GetDefaultLogger()->GetMinimumLogLevel()) |
+ |
+#define MOJO_LOG(level) \ |
+ MOJO_LAZY_LOG_STREAM(level, MOJO_SHOULD_LOG(level)) |
+ |
+#define MOJO_LOG_IF(level, condition) \ |
+ MOJO_LAZY_LOG_STREAM(level, MOJO_SHOULD_LOG(level) && (condition)) |
+ |
+#define MOJO_CHECK(condition) \ |
+ MOJO_LAZY_LOG_STREAM(FATAL, !(condition)) \ |
+ << "Check failed: " #condition ". " |
+ |
+// Note: For non-debug builds, |MOJO_DLOG_IF()| *eliminates* (i.e., doesn't |
+// compile) the condition, whereas |MOJO_DCHECK()| "neuters" the condition |
+// (i.e., compiles, but doesn't evaluate). |
+#ifdef NDEBUG |
+ |
+#define MOJO_DLOG(level) MOJO_LAZY_LOG_STREAM(level, false) |
+#define MOJO_DLOG_IF(level, condition) MOJO_LAZY_LOG_STREAM(level, false) |
+#define MOJO_DCHECK(condition) MOJO_LAZY_LOG_STREAM(FATAL, false && (condition)) |
+ |
+#else |
+ |
+#define MOJO_DLOG(level) MOJO_LOG(level) |
+#define MOJO_DLOG_IF(level, condition) MOJO_LOG_IF(level, condition) |
+#define MOJO_DCHECK(condition) MOJO_CHECK(condition) |
+ |
+#endif // NDEBUG |
+ |
+namespace mojo { |
+namespace internal { |
+ |
+class LogMessage { |
+ public: |
+ LogMessage(const char* file, int line, MojoLogLevel log_level); |
+ ~LogMessage(); |
+ |
+ std::ostream& stream() { return stream_; } |
+ |
+ private: |
+ const MojoLogLevel log_level_; |
+ std::ostringstream stream_; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(LogMessage); |
+}; |
+ |
+// Used to ignore a stream. |
+struct VoidifyOstream { |
+ // Use & since it has precedence lower than << but higher than ?:. |
+ void operator&(std::ostream&) {} |
+}; |
+ |
+} // namespace internal |
+} // namespace mojo |
+ |
+#endif // MOJO_PUBLIC_CPP_ENVIRONMENT_LOGGING_H_ |