text: // Copyright 2019 The Fuchsia 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 SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_
  #define SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_
  
  // This header is meant to be the hub of debug logging: timers, logging, etc. There is no need to
  // include the other headers directly.
  
  #include <sstream>
  
  #include "src/developer/debug/shared/logging/macros.h"
  #include "src/developer/debug/shared/logging/debug.h"
  #include "src/developer/debug/shared/logging/file_line_function.h"
  
  namespace debug_ipc {
  
  // Normally you would use this macro to create logging statements.
  // Example:
  //
  // DEBUG_LOG(Job) << "Some job statement.";
  // DEBUG_LOG(MessageLoop) << "Some event with id " << id;
  //
  // If the logging will occur on some other function, you can pass the location into the other macro:
  //
  //
  // if (err.has_error())
  //   LogSomewhereElse(FROM_HERE, LogCategory::kAgent, error.msg());
  //
  //  ...
  //
  // void LogSomewhereElse(FileLineFunction location, LogCategory category, std::string msg) {
  //    ...
  //    DEBUG_LOG_WITH_LOCATION(category, location) << msg;
  // }
  //
  
  #define DEBUG_LOG_WITH_LOCATION(category, location)           \
    ::debug_ipc::LogStatement STRINGIFY(__debug_log, __LINE__)( \
        location, ::debug_ipc::LogCategory::k##category);       \
    STRINGIFY(__debug_log, __LINE__).stream()
  
  #define DEBUG_LOG(category) \
    DEBUG_LOG_WITH_LOCATION(category, FROM_HERE)
  
  // Creates a conditional logger depending whether the debug mode is active or not. See debug.h for
  // more details.
  class LogStatement {
   public:
    explicit LogStatement(FileLineFunction origin, LogCategory);
    ~LogStatement();
  
    std::ostream& stream() { return stream_; }
    std::string GetMsg();
  
    const FileLineFunction& origin() const { return origin_; }
    LogCategory category() const { return category_; }
    double start_time() const { return start_time_; }
  
   private:
    FileLineFunction origin_;
    LogCategory category_;
    bool should_log_ = false;
    double start_time_;
  
    std::ostringstream stream_;
  };
  
  }  // namespace debug_ipc
  
  #endif  // SRC_DEVELOPER_DEBUG_SHARED_LOGGING_LOGGING_H_
  