| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ACCESSIBILITY_BASE_LOGGING_H_ |
| #define ACCESSIBILITY_BASE_LOGGING_H_ |
| |
| #include <sstream> |
| |
| #include "macros.h" |
| |
| namespace base { |
| |
| class LogMessageVoidify { |
| public: |
| void operator&(std::ostream&) {} |
| }; |
| |
| class LogMessage { |
| public: |
| LogMessage(const char* file, |
| int line, |
| const char* condition, |
| bool killProcess); |
| ~LogMessage(); |
| |
| std::ostream& stream() { return stream_; } |
| |
| private: |
| std::ostringstream stream_; |
| const char* file_; |
| const int line_; |
| const bool killProcess_; |
| |
| BASE_DISALLOW_COPY_AND_ASSIGN(LogMessage); |
| }; |
| |
| [[noreturn]] void KillProcess(); |
| |
| } // namespace base |
| |
| #define BASE_LOG_STREAM() \ |
| ::base::LogMessage(__FILE__, __LINE__, nullptr, false).stream() |
| |
| #define BASE_LAZY_STREAM(stream, condition) \ |
| !(condition) ? (void)0 : ::base::LogMessageVoidify() & (stream) |
| |
| #define BASE_EAT_STREAM_PARAMETERS(ignored) \ |
| true || (ignored) \ |
| ? (void)0 \ |
| : ::base::LogMessageVoidify() & \ |
| ::base::LogMessage(0, 0, nullptr, !(ignored)).stream() |
| |
| #define BASE_LOG() BASE_LAZY_STREAM(BASE_LOG_STREAM(), true) |
| |
| #define BASE_CHECK(condition) \ |
| BASE_LAZY_STREAM( \ |
| ::base::LogMessage(__FILE__, __LINE__, #condition, true).stream(), \ |
| !(condition)) |
| |
| #ifndef NDEBUG |
| #define BASE_DLOG() BASE_LOG() |
| #define BASE_DCHECK(condition) BASE_CHECK(condition) |
| #else |
| #define BASE_DLOG() BASE_EAT_STREAM_PARAMETERS(true) |
| #define BASE_DCHECK(condition) BASE_EAT_STREAM_PARAMETERS(condition) |
| #endif |
| |
| #define BASE_UNREACHABLE() \ |
| { \ |
| BASE_LOG() << "Reached unreachable code."; \ |
| ::base::KillProcess(); \ |
| } |
| |
| #endif // ACCESSIBILITY_BASE_LOGGING_H_ |