|
/*
|
|
* Copyright (C) 2023 Christopher J. Howard
|
|
*
|
|
* This file is part of Antkeeper source code.
|
|
*
|
|
* Antkeeper source code is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Antkeeper source code is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef ANTKEEPER_DEBUG_LOG_HPP
|
|
#define ANTKEEPER_DEBUG_LOG_HPP
|
|
|
|
#include "config.hpp"
|
|
#include "debug/log/message-severity.hpp"
|
|
#include "debug/log/logger.hpp"
|
|
#include <source_location>
|
|
#include <string>
|
|
#include <format>
|
|
|
|
// Enable logging of messages of all severities by default.
|
|
#if !defined(ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY)
|
|
#define ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY (ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_TRACE)
|
|
#endif
|
|
|
|
namespace debug {
|
|
|
|
/**
|
|
* Debug message logging.
|
|
*/
|
|
namespace log {
|
|
|
|
/**
|
|
* Returns the default logger.
|
|
*/
|
|
[[nodiscard]] logger& default_logger() noexcept;
|
|
|
|
/**
|
|
* Self-formatting message that logs itself to the default logger on construction.
|
|
*
|
|
* @tparam Severity Message severity. A message will not log itself if @p Severity is less than the user-defined macro `ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY`.
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <message_severity Severity, class... Args>
|
|
struct message
|
|
{
|
|
/**
|
|
* Formats and logs a message.
|
|
*
|
|
* Class template argument deduction (CTAD) is utilized to capture source location as a default argument following variadic format arguments.
|
|
*
|
|
* @param format Message format string.
|
|
* @param args Arguments to be formatted.
|
|
* @param location Source location from which the message was sent.
|
|
*/
|
|
message
|
|
(
|
|
[[maybe_unused]] std::string_view format,
|
|
[[maybe_unused]] Args&&... args,
|
|
[[maybe_unused]] std::source_location&& location = std::source_location::current()
|
|
)
|
|
{
|
|
if constexpr (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= static_cast<std::underlying_type_t<message_severity>>(Severity))
|
|
{
|
|
default_logger().log(std::vformat(format, std::make_format_args(std::forward<Args>(args)...)), Severity, std::forward<std::source_location>(location));
|
|
}
|
|
}
|
|
};
|
|
|
|
// Use class template argument deduction (CTAD) to capture source location as a default argument following variadic format arguments.
|
|
template <message_severity Severity, class... Args>
|
|
message(std::string_view, Args&&...) -> message<Severity, Args...>;
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_TRACE)
|
|
/**
|
|
* Formats and logs a trace message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using trace = message<message_severity::trace, Args...>;
|
|
#else
|
|
// Disable trace message logging.
|
|
template <class... Args>
|
|
inline void trace([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_DEBUG)
|
|
/**
|
|
* Formats and logs a debug message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using debug = message<message_severity::debug, Args...>;
|
|
#else
|
|
// Disable debug message logging.
|
|
template <class... Args>
|
|
inline void debug([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_INFO)
|
|
/**
|
|
* Formats and logs an info message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using info = message<message_severity::info, Args...>;
|
|
#else
|
|
// Disable info message logging.
|
|
template <class... Args>
|
|
inline void info([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_WARNING)
|
|
/**
|
|
* Formats and logs a warning message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using warning = message<message_severity::warning, Args...>;
|
|
#else
|
|
// Disable warning message logging.
|
|
template <class... Args>
|
|
inline void warning([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_ERROR)
|
|
/**
|
|
* Formats and logs an error message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using error = message<message_severity::error, Args...>;
|
|
#else
|
|
// Disable error message logging.
|
|
template <class... Args>
|
|
inline void error([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
#if (ANTKEEPER_DEBUG_LOG_MIN_MESSAGE_SEVERITY <= ANTKEEPER_DEBUG_LOG_MESSAGE_SEVERITY_FATAL)
|
|
/**
|
|
* Formats and logs a fatal error message.
|
|
*
|
|
* @tparam Args Types of arguments to be formatted.
|
|
*/
|
|
template <class... Args>
|
|
using fatal = message<message_severity::fatal, Args...>;
|
|
#else
|
|
// Disable fatal error message logging.
|
|
template <class... Args>
|
|
inline void fatal([[maybe_unused]] Args&&...) noexcept {};
|
|
#endif
|
|
|
|
} // namespace log
|
|
} // namespace debug
|
|
|
|
#endif // ANTKEEPER_DEBUG_LOG_HPP
|