3#include <StormByte/string.hxx>
25 class STORMBYTE_PUBLIC
Logger final {
27 friend STORMBYTE_PUBLIC
Logger& humanreadable_number(
Logger& logger)
noexcept;
28 friend STORMBYTE_PUBLIC
Logger& humanreadable_bytes(
Logger& logger)
noexcept;
29 friend STORMBYTE_PUBLIC
Logger& nohumanreadable(
Logger& logger)
noexcept;
36 enum class STORMBYTE_PUBLIC
Level :
unsigned short {
52 case Level::LowLevel:
return "LowLevel";
53 case Level::Debug:
return "Debug";
54 case Level::Warning:
return "Warning";
55 case Level::Notice:
return "Notice";
56 case Level::Info:
return "Info";
57 case Level::Error:
return "Error";
58 case Level::Fatal:
return "Fatal";
59 default:
return "Unknown";
69 Logger(std::ostream& out,
const Level& level = Level::Info,
const std::string& format =
"[%L] %T") noexcept;
101 Logger& operator<<(const Level& level) noexcept;
104 Logger& operator<<(std::ostream& (*manip)(std::ostream&)) noexcept;
121 template <
typename T>
123 requires (!std::is_same_v<std::decay_t<T>,
Logger& (*)(
Logger&)
noexcept>) {
124 using DecayedT = std::decay_t<T>;
126 if constexpr (std::is_same_v<DecayedT, bool>) {
127 print_message(value ?
"true" :
"false");
129 else if constexpr (std::is_integral_v<DecayedT> || std::is_floating_point_v<DecayedT>) {
130 print_message(value);
132 else if constexpr (std::is_same_v<DecayedT, std::string> || std::is_same_v<DecayedT, const char*>) {
133 print_message(std::string(value));
135 else if constexpr (std::is_same_v<DecayedT, std::wstring> || std::is_same_v<DecayedT, const wchar_t*>) {
136 print_message(String::UTF8Encode(value));
138 else if constexpr (std::is_array_v<T> && std::is_same_v<std::remove_extent_t<T>,
char>) {
139 print_message(std::string(value));
142 static_assert(!std::is_same_v<T, T>,
"Unsupported type for Logger::operator<<");
150 std::optional<Level> m_current_level;
151 bool m_header_displayed;
152 const std::string m_format;
153 String::Format m_human_readable_format;
158 void print_time() const noexcept;
163 void print_level() const noexcept;
168 void print_header() const noexcept;
171 template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T> && !std::is_same_v<T,
wchar_t>>>
172 void print_message(const T& value) noexcept {
174 if (m_human_readable_format == String::Format::Raw) {
175 message = std::to_string(value);
179 message = String::HumanReadable(value, m_human_readable_format,
"en_US.UTF-8");
181 print_message(message);
185 void print_message(
const std::string& message)
noexcept;
188 void print_message(
const wchar_t& value)
noexcept;
192 inline STORMBYTE_PUBLIC Logger& humanreadable_number(Logger& logger)
noexcept {
193 logger.m_human_readable_format = String::Format::HumanReadableNumber;
198 inline STORMBYTE_PUBLIC Logger& humanreadable_bytes(Logger& logger)
noexcept {
199 logger.m_human_readable_format = String::Format::HumanReadableBytes;
204 inline STORMBYTE_PUBLIC Logger& nohumanreadable(Logger& logger)
noexcept {
205 logger.m_human_readable_format = String::Format::Raw;
209 template <
typename Ptr,
typename T>
210 Ptr&
operator<<(Ptr& logger,
const T& value)
noexcept
211 requires std::is_same_v<Ptr, std::shared_ptr<Logger>> || std::is_same_v<Ptr, std::unique_ptr<Logger>> {
218 template <
typename Ptr>
220 requires std::is_same_v<Ptr, std::shared_ptr<Logger>> || std::is_same_v<Ptr, std::unique_ptr<Logger>> {
227 template <
typename Ptr>
228 Ptr&
operator<<(Ptr& logger, std::ostream& (*manip)(std::ostream&))
noexcept
229 requires std::is_same_v<Ptr, std::shared_ptr<Logger>> || std::is_same_v<Ptr, std::unique_ptr<Logger>> {
A flexible and extensible logging utility.
Definition logger.hxx:25
enum STORMBYTE_PUBLIC Info
Info level.
Definition logger.hxx:41
static constexpr std::string LevelToString(const Level &l) noexcept
Definition logger.hxx:50
enum STORMBYTE_PUBLIC Warning
Warning level.
Definition logger.hxx:39
enum STORMBYTE_PUBLIC Level
Low level debug level.
Definition logger.hxx:36
Logger(std::ostream &out, const Level &level=Level::Info, const std::string &format="[%L] %T") noexcept
enum STORMBYTE_PUBLIC Debug
Debug level.
Definition logger.hxx:38
enum STORMBYTE_PUBLIC Notice
Notice level.
Definition logger.hxx:40
Logger & operator<<(const T &value) noexcept
Definition logger.hxx:122
enum STORMBYTE_PUBLIC Error
Error level.
Definition logger.hxx:42
PtrType & operator<<(PtrType &ptr, const T &value)
Wrapper for operator<< to support std::shared_ptr or std::unique_ptr as the left-hand parameter.
Definition typedefs.hxx:179
Main namespace for the StormByte library.