1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LOGGER_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LOGGER_H
17#include <molpro/iostream.h>
53 { T::name } -> std::convertible_to<const char *>;
60template<
typename CRTP,
bool fixed_args,
typename ...Args >
65 static constexpr const char *
name = []() {
69 return typeid(CRTP).
name();
83 static constexpr std::size_t
num_args =
sizeof...(Args);
91 static constexpr decltype(
auto)
to_arg(T &&arg) {
92 if constexpr (std::ranges::view<T>) {
93 return std::forward<T>(arg);
94 }
else if constexpr (std::ranges::range<std::remove_cvref_t<T>>) {
95 return std::ranges::views::all(arg);
97 return std::as_const(arg);
105 template<std::
size_t Idx>
107 using arg_t =
decltype(
to_arg(std::declval<std::tuple_element_t<Idx, arg_types_tuple>>()));
112 template<std::size_t Idx,
typename ...Ts>
114 return to_arg(std::get<Idx>(std::forward_as_tuple(std::forward<Ts>(args)...)));
122template<
typename T >
125 []<
bool b,
typename...Ts>(
const ContextBase<T, b, Ts...> &){}(t);
131template<
typename Ctx,
typename ...Args >
139concept streamable =
requires (std::ostream &stream,
const std::remove_cvref_t<T> &t) {
147concept formattable =
requires (
const std::remove_cvref_t<T> &t, std::format_context ctx) {
148 std::formatter<std::remove_cvref_t<T>>().format(t, ctx);
163template<std::
size_t MaxSize>
170 template<std::
size_t N>
171 requires(N - 1 <= MaxSize)
174 for (std::size_t i = 0; i < N - 1; ++i) {
175 push_back(literal[i]);
181 if (m_size == MaxSize) {
182 throw std::out_of_range(
"Maximum capacity has been reached - can't append further chars");
185 m_data.at(m_size) = c;
189 constexpr std::size_t
size()
const {
return m_size; }
193 throw std::out_of_range(
"Requested index is out of range");
196 return m_data.at(idx);
200 return {m_data.data(), m_size};
203 constexpr operator std::string_view()
const {
208 std::array<char, MaxSize> m_data;
209 std::size_t m_size = 0;
236template<std::
size_t precision>
244 if (precision == 0) {
247 std::size_t begin = str.
size();
250 std::size_t prec_val = precision;
251 while (prec_val > 0) {
252 std::size_t tmp = prec_val / 10;
253 std::size_t digit = prec_val - tmp * 10;
256 str.
push_back(
'0' +
static_cast<char>(digit));
262 for (std::size_t i = 0; i <
num_digits / 2; ++i) {
263 std::swap(str[i + begin], str[str.
size() - i - 1]);
286template<context Context,
typename T, std::
size_t precision = default_precision>
293 return create_fmt_string_for_precision<precision>();
315 stream << std::setprecision(precision);
324template<context Context, std::
size_t precision = default_precision,
typename T>
325requires(formattable<T> || streamable<T> || string_convertible_range<T>)
326static std::string stringify(T &&t) {
327 using FOpts = FormatOption<Context, std::remove_cvref_t<T>, precision>;
329 if constexpr (formattable<T>) {
330 static constexpr auto fmt = FOpts::format_string();
331 return std::format(fmt.as_view(), t);
332 }
else if constexpr (streamable<T>) {
333 std::stringstream sstream;
334 FOpts::prepare_stream(sstream);
336 return sstream.str();
338 std::stringstream sstream;
340 using std::ranges::begin;
341 using std::ranges::end;
343 sstream << FOpts::range_begin_mark();
345 for (
auto it = begin(t); it != end(t); ++it) {
346 sstream << stringify<Context, precision>(*it);
348 if (it + 1 != end(t)) {
349 sstream << FOpts::range_separator();
353 sstream << FOpts::range_end_mark();
355 return sstream.str();
364template<
typename Context, std::
size_t precision,
typename T>
366 { stringify<Context, precision>(t) } -> std::same_as<std::string>;
392template< context Context >
394 template<
typename ...Ts>
397 template<
typename ...Ts>
401template<
typename Context,
typename ...Args >
404 std::declval<std::string_view>(), args...);
406template<
typename Context,
typename ...Args >
408 handler.handle(std::declval<Severity>(), std::declval<Verbosity>(),
409 std::declval<std::string_view>(), args...);
415template<
typename Context,
typename ...Args >
438 log_ctx(Context::name,
sizeof...(args));
440 if (
verbosity < m_verbosity || severity < m_min_severity) {
445 if constexpr (Context::uses_fixed_arguments) {
453 const Handler *handler =
dynamic_cast<const Handler *
>(
this);
455 handler->
handle(severity,
verbosity, message, std::forward<Ts>(args)...);
457 Handler::handle(*
this, severity,
verbosity, message, std::forward<Ts>(args)...);
460 dynamic_cast<const Handler &
>(*this).handle(severity,
verbosity, message, std::forward<Ts>(args)...);
463 Handler::handle(*
this, severity,
verbosity, message, std::forward<Ts>(args)...);
465 }
else if constexpr (
sizeof...(args) > 0) {
466 std::string arg_str = ((log::stringify<Context, precision>(std::forward<Ts>(args)) +
", ") + ...);
468 if (!message.empty() && message.back() !=
' ') {
471 arg_str =
" -> " + arg_str;
481 void trace(std::string_view message, Ts && ...args)
const {
486 void debug(std::string_view message, Ts && ...args)
const {
491 void info(std::string_view message, Ts && ...args)
const {
496 void warn(std::string_view message, Ts && ...args)
const {
501 void error(std::string_view message, Ts && ...args)
const {
506 void fatal(std::string_view message, Ts && ...args)
const {
512 void data_dump(std::string_view what, Ts...data)
const {
537 bool add_colon =
false;
542 molpro::cout <<
"[WARNING]";
546 molpro::cout <<
"[ERROR]:";
550 molpro::cout <<
"[FATAL]:";
558 molpro::cout <<
"[INFO]";
562 molpro::cout <<
"[DEBUG]";
566 molpro::cout <<
"[TRACE]";
572 molpro::cout <<
"[" << ctx <<
"]";
576 molpro::cout << (add_colon ?
": " :
"") <<
msg;
578 molpro::cout << std::endl;
580 molpro::cout <<
"\n";
584 virtual void log_ctx(std::string_view ctx, std::size_t num_args)
const {
594 bool m_dump_data =
false;
void set_min_severity(log::Severity severity)
Definition: Logger.h:523
void info(std::string_view message, Ts &&...args) const
Definition: Logger.h:491
Logger(log::Severity min_severity=log::Severity::Normal, log::Verbosity verbosity=log::Verbosity::Info, bool enable_data_dumps=false)
Definition: Logger.h:430
void warn(std::string_view message, Ts &&...args) const
Definition: Logger.h:496
void debug(std::string_view message, Ts &&...args) const
Definition: Logger.h:486
log::Verbosity verbosity() const
Definition: Logger.h:525
void msg(log::Severity severity, log::Verbosity verbosity, std::string_view message, Ts &&...args) const
Definition: Logger.h:437
void error(std::string_view message, Ts &&...args) const
Definition: Logger.h:501
void data_dump(std::string_view what, Ts...data) const
Definition: Logger.h:512
virtual void default_message_handler(std::string_view ctx, log::Severity severity, log::Verbosity verbosity, std::string_view msg) const
Definition: Logger.h:536
void fatal(std::string_view message, Ts &&...args) const
Definition: Logger.h:506
bool data_dumps_enabled() const
Definition: Logger.h:529
log::Severity min_severity() const
Definition: Logger.h:521
void trace(std::string_view message, Ts &&...args) const
Definition: Logger.h:481
void enable_data_dumps(bool enable)
Definition: Logger.h:531
virtual void log_ctx(std::string_view ctx, std::size_t num_args) const
Definition: Logger.h:584
void set_verbosity(log::Verbosity verbosity)
Definition: Logger.h:527
constexpr ~ConstexprString()
Definition: Logger.h:178
constexpr ConstexprString()
Definition: Logger.h:167
constexpr ConstexprString(const char(&literal)[N])
Definition: Logger.h:172
constexpr void push_back(char c)
Definition: Logger.h:180
constexpr char & operator[](std::size_t idx)
Definition: Logger.h:191
constexpr std::size_t size() const
Definition: Logger.h:189
constexpr std::string_view as_view() const
Definition: Logger.h:199
Definition: IterativeSolverTemplate.h:125
constexpr const std::size_t default_precision
Definition: Logger.h:276
constexpr std::size_t num_digits(std::size_t val)
Definition: Logger.h:216
Verbosity
Different levels of logging.
Definition: Logger.h:29
constexpr ConstexprString< num_digits(precision)+4 > create_fmt_string_for_precision()
Definition: Logger.h:237
Severity
Severity of a given message.
Definition: Logger.h:40
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition: helper.h:11
static constexpr const char * name
Definition: Logger.h:65
static arg_t< Idx > get_arg(Ts &&...args)
Definition: Logger.h:113
std::tuple< std::remove_cvref_t< Args >... > arg_types_tuple
Definition: Logger.h:78
decltype(to_arg(std::declval< std::tuple_element_t< Idx, arg_types_tuple > >())) arg_t
Definition: Logger.h:107
static constexpr bool uses_fixed_arguments
Definition: Logger.h:75
static constexpr decltype(auto) to_arg(T &&arg)
Definition: Logger.h:91
static constexpr std::size_t num_args
Definition: Logger.h:83
static constexpr const char * name
Definition: Logger.h:381
static constexpr const char * name
Definition: Logger.h:376
void handle(Severity severity, Verbosity verbosity, std::string_view message, Ts...args)=delete
static void handle(const Logger &logger, Severity severity, Verbosity verbosity, std::string_view message, Ts...args)=delete