qxLib
base_standard_streams_stream.inl
Go to the documentation of this file.
1 /**
2 
3  @file base_standard_streams_stream.inl
4  @author Khrapov
5  @date 18.01.2026
6  @copyright © Nick Khrapov, 2026. All right reserved.
7 
8 **/
9 
10 namespace qx
11 {
12 
14  : base_logger_stream(streamConfig)
15  , m_bUsingColors(streamConfig.bUseColors)
16  , m_bSyncUsualAndErrorMessages(streamConfig.bSyncUsualAndErrorMessages)
17 {
18 }
19 
21  const category& category,
22  verbosity eVerbosity,
23  std::thread::id threadId,
24  std::chrono::system_clock::time_point messageTime,
25  string_view svFile,
26  string_view svFunction,
27  int nLine,
28  string_view svMessage)
29 {
30  if (m_bUsingColors)
31  {
32  color lineColor = color::white();
33  switch (eVerbosity)
34  {
35  case verbosity::detailed:
36  case verbosity::verbose:
37  lineColor = color::gray();
38  break;
39 
40  case verbosity::log:
41  lineColor = color::white();
42  break;
43 
44  case verbosity::important:
45  lineColor = color::khaki();
46  break;
47 
48  case verbosity::warning:
49  lineColor = color::orange();
50  break;
51 
52  case verbosity::error:
53  lineColor = color::crimson();
54  break;
55 
56  case verbosity::critical:
57  lineColor = color::dark_red();
58  break;
59  }
60 
61  struct logger_color_range
62  {
63  string_view svPart;
64  color partColor = color::white();
65  };
66 
67  std::array<logger_color_range, 16> colors;
68  size_t nColorsCount = 0;
69 
70  if (const size_t nPos = svMessage.find(category.get_name()); nPos != string::npos)
71  {
72  colors[0] = { .svPart = { svMessage.begin(), svMessage.begin() + nPos }, .partColor = lineColor };
73  ++nColorsCount;
74 
75  colors[1] = { .svPart = { svMessage.begin() + nPos, svMessage.begin() + nPos + category.get_name().size() },
76  .partColor = category.get_color() };
77  ++nColorsCount;
78 
79  // exclude \n
80  colors[2] = { .svPart = { svMessage.begin() + nPos + category.get_name().size(),
81  svMessage.begin() + svMessage.size() - 1 },
82  .partColor = lineColor };
83  ++nColorsCount;
84  }
85  else
86  {
87  // exclude \n
88  colors[0] = { .svPart = { svMessage.begin(), svMessage.begin() + svMessage.size() - 1 },
89  .partColor = lineColor };
90  ++nColorsCount;
91  }
92 
93  for (size_t i = 0; i < nColorsCount; ++i)
94  {
95  cout_colorized(eVerbosity, colors[i].svPart, colors[i].partColor);
96  }
97 
98  // cout \n
99  cout_common(eVerbosity, { &svMessage.back(), 1 });
100  }
101  else
102  {
103  cout_common(eVerbosity, svMessage);
104  }
105 }
106 
107 inline void base_standard_streams_stream::check_previous_message(verbosity eCurrentMessageVerbosity)
108 {
109  if (m_bSyncUsualAndErrorMessages)
110  {
111  const bool bCurrentMessageIsError = is_error(eCurrentMessageVerbosity);
112 
113  if (bCurrentMessageIsError != m_bPrevMessageWasError)
114  flush();
115 
116  m_bPrevMessageWasError = bCurrentMessageIsError;
117  }
118 }
119 
120 } // namespace qx
Base class for logger streams.
void flush()
Flush the stream.
void check_previous_message(verbosity eCurrentMessageVerbosity)
Check the previous message type and flush if needed.
base_standard_streams_stream(const config &streamConfig) noexcept
base_standard_streams_stream object constructor
virtual void do_log(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine, string_view svMessage) override
Proceed stream logging.
A category is a class that identifies a particular piece of code. This code can be located in differe...
Definition: category.h:59
constexpr string_view get_name() const noexcept
Get category name.
Definition: category.inl:26
constexpr const color & get_color() const noexcept
Get category color.
Definition: category.inl:31
RGBA color.
Definition: color.h:193
static constexpr size_t size() noexcept
Get number of float components.
Definition: color.inl:392
bool is_error(verbosity eVerbosity) noexcept
Check if the verbosity level is an error.
Definition: verbosity.h:35