Program Listing for File logging.h

Return to documentation for file (include/converter/include/mindapi/base/logging.h)

#ifndef MINDSPORE_CORE_MINDAPI_BASE_LOGGING_H_
#define MINDSPORE_CORE_MINDAPI_BASE_LOGGING_H_

#include <cstdint>
#include <memory>
#include <sstream>
#include <utility>
#include "mindapi/base/macros.h"

namespace mindspore::api {
enum class LogLevel : uint8_t { kDebug = 0, kInfo, kWarning, kError, kException };

class LogWriterImpl;

class LogStream {
 public:
  template <typename T>
  LogStream &operator<<(T &&value) noexcept {
    stream_ << (std::forward<T>(value));
    return *this;
  }

 private:
  friend class LogWriterImpl;
  std::stringstream stream_;
};

class MIND_API LogWriter {
 public:
  LogWriter(LogLevel level, const char *file, int line, const char *func);

  ~LogWriter();

  void operator<(const LogStream &stream) const noexcept;

  void operator^(const LogStream &stream) const NO_RETURN;

  static bool IsEnabled(LogLevel level);

 private:
  std::unique_ptr<LogWriterImpl> impl_;
};

#define MIND_LOG_STREAM mindspore::api::LogStream()
#define MIND_LOG_WRITER mindspore::api::LogWriter
#define MIND_LOG_LEVEL(L) mindspore::api::LogLevel::L

#define MIND_LOG_THROW(L) MIND_LOG_WRITER(MIND_LOG_LEVEL(L), __FILE__, __LINE__, __FUNCTION__) ^ MIND_LOG_STREAM
#define MIND_LOG_WRITE(L) MIND_LOG_WRITER(MIND_LOG_LEVEL(L), __FILE__, __LINE__, __FUNCTION__) < MIND_LOG_STREAM
#define MIND_LOG_IF(L) \
  if (MIND_LOG_WRITER::IsEnabled(MIND_LOG_LEVEL(L))) MIND_LOG_WRITE(L)

#define MIND_LOG_DEBUG MIND_LOG_IF(kDebug)
#define MIND_LOG_INFO MIND_LOG_IF(kInfo)
#define MIND_LOG_WARNING MIND_LOG_IF(kWarning)
#define MIND_LOG_ERROR MIND_LOG_IF(kError)
#define MIND_LOG_EXCEPTION MIND_LOG_THROW(kException)
#define MIND_LOG(level) MIND_LOG_##level

#if !defined(MIND_LOG_NO_MS_LOG) && !defined(MS_LOG)
#define MS_LOG(level) MIND_LOG_##level
#endif
}  // namespace mindspore::api

#endif  // MINDSPORE_CORE_MINDAPI_BASE_LOGGING_H_