100 lines
2.4 KiB
C++
100 lines
2.4 KiB
C++
// Copyright (C) 2018-2024 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
/**
|
|
* @brief a header file with logging facility for common samples
|
|
* @file log.hpp
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
namespace slog {
|
|
|
|
/**
|
|
* @class LogStreamEndLine
|
|
* @brief The LogStreamEndLine class implements an end line marker for a log stream
|
|
*/
|
|
class LogStreamEndLine { };
|
|
|
|
static constexpr LogStreamEndLine endl;
|
|
|
|
|
|
/**
|
|
* @class LogStreamBoolAlpha
|
|
* @brief The LogStreamBoolAlpha class implements bool printing for a log stream
|
|
*/
|
|
class LogStreamBoolAlpha { };
|
|
|
|
static constexpr LogStreamBoolAlpha boolalpha;
|
|
|
|
|
|
/**
|
|
* @class LogStream
|
|
* @brief The LogStream class implements a stream for sample logging
|
|
*/
|
|
class LogStream {
|
|
std::string _prefix;
|
|
std::ostream* _log_stream;
|
|
bool _new_line;
|
|
|
|
public:
|
|
/**
|
|
* @brief A constructor. Creates a LogStream object
|
|
* @param prefix The prefix to print
|
|
*/
|
|
LogStream(const std::string &prefix, std::ostream& log_stream)
|
|
: _prefix(prefix), _new_line(true) {
|
|
_log_stream = &log_stream;
|
|
}
|
|
|
|
/**
|
|
* @brief A stream output operator to be used within the logger
|
|
* @param arg Object for serialization in the logger message
|
|
*/
|
|
template<class T>
|
|
LogStream &operator<<(const T &arg) {
|
|
if (_new_line) {
|
|
(*_log_stream) << "[ " << _prefix << " ] ";
|
|
_new_line = false;
|
|
}
|
|
|
|
(*_log_stream) << arg;
|
|
return *this;
|
|
}
|
|
|
|
// Specializing for LogStreamEndLine to support slog::endl
|
|
LogStream& operator<< (const LogStreamEndLine &/*arg*/) {
|
|
_new_line = true;
|
|
|
|
(*_log_stream) << std::endl;
|
|
return *this;
|
|
}
|
|
|
|
// Specializing for LogStreamBoolAlpha to support slog::boolalpha
|
|
LogStream& operator<< (const LogStreamBoolAlpha &/*arg*/) {
|
|
(*_log_stream) << std::boolalpha;
|
|
return *this;
|
|
}
|
|
|
|
// Specializing for std::vector and std::list
|
|
template<template<class, class> class Container, class T>
|
|
LogStream& operator<< (const Container<T, std::allocator<T>>& container) {
|
|
for (const auto& el : container) {
|
|
*this << el << slog::endl;
|
|
}
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
|
|
static LogStream info("INFO", std::cout);
|
|
static LogStream debug("DEBUG", std::cout);
|
|
static LogStream warn("WARNING", std::cout);
|
|
static LogStream err("ERROR", std::cerr);
|
|
|
|
} // namespace slog
|