1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LOGGER_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ITSOLV_LOGGER_H
21#include <molpro/iostream.h>
88template <
typename Scalar>
89using real_t =
decltype(std::abs(std::declval<Scalar>()));
108concept pair_like =
requires(
const std::remove_cvref_t<T> &
t) {
123concept formattable =
requires(
const std::remove_cvref_t<T> &
t, std::format_context
ctx) {
124 std::formatter<std::remove_cvref_t<T>>().format(
t,
ctx);
131concept string_like = std::convertible_to<const std::remove_cvref_t<T> &, std::string_view>;
138 if constexpr (std::ranges::input_range<const T>)
139 return !std::same_as<std::remove_cvref_t<std::ranges::range_reference_t<const T>>,
T>;
147 using U = std::remove_cvref_t<T>;
179 using U = std::remove_cvref_t<T>;
183 return std::string(std::string_view(
t));
185 std::ostringstream
stream;
190 }
else if constexpr (std::floating_point<U>) {
191 return precise ? std::format(
"{:.{}}",
t, precision) : std::format(
"{}",
t);
194 }
else if constexpr (detail::is_printable_range<U>()) {
207 return std::vformat(
"{:." + std::to_string(precision) +
"}", std::make_format_args(
t));
208 }
catch (
const std::format_error &) {
212 return std::format(
"{}",
t);
214 std::ostringstream
stream;
225template <
typename Ctx>
227 { Ctx::name } -> std::convertible_to<std::string_view>;
228 typename Ctx::Payload;
234template <
typename Ctx>
236 { Ctx::format(
p) } -> std::convertible_to<std::string>;
242template <
typename Ctx>
244 requires Ctx::is_data_dump;
251 static constexpr std::string_view
name =
"Generic";
260 static constexpr std::string_view
name =
"DataDump";
276inline std::string
compose(std::string_view message, std::string_view
suffix) {
278 return std::string(message);
279 if (!message.empty() && message.back() !=
' ')
280 return std::string(message) +
" -> " + std::string(
suffix);
281 return std::string(message) + std::string(
suffix);
297 const std::type_info &
type()
const {
return *m_type; }
302 template <event_context Ctx>
304 return *m_type ==
typeid(
Ctx);
310 template <event_context Ctx>
311 const typename Ctx::Payload *
get()
const {
312 return is<Ctx>() ?
static_cast<const typename Ctx::Payload *
>(m_payload) :
nullptr;
325 template <event_context Ctx>
327 const typename Ctx::Payload &
payload) {
333 record.m_format = [](
const void *
p) {
334 return std::string(Ctx::format(*
static_cast<const typename Ctx::Payload *
>(
p)));
343 const std::type_info *m_type =
nullptr;
344 const void *m_payload =
nullptr;
345 std::string (*m_format)(
const void *) =
nullptr;
346 bool m_data_dump =
false;
385 m_sinks.push_back({m_next_id, filter,
nullptr, std::move(sink)});
395 template <log::event_context Ctx,
typename F>
396 requires std::invocable<F &, const log::Record &, const typename Ctx::Payload &>
407 std::erase_if(m_sinks, [
id](
const SinkEntry &
entry) {
return entry.id == id; });
415 template <log::event_context Ctx,
typename MakePayload>
416 requires std::invocable<MakePayload &>
420 const typename Ctx::Payload
payload = make();
428 template <log::event_context Ctx>
436 template <log::event_context Ctx>
437 requires std::default_initializable<typename Ctx::Payload>
445 template <
typename...
Ts>
451 if constexpr (
sizeof...(args) > 0) {
456 dispatch(log::Record::make<log::Generic>(severity,
verbosity, text,
payload));
458 dispatch(log::Record::make<log::Generic>(severity,
verbosity, message,
payload));
462 template <
typename...
Ts>
467 template <
typename...
Ts>
472 template <
typename...
Ts>
473 void info(std::string_view message,
const Ts &...
args)
const {
477 template <
typename...
Ts>
478 void warn(std::string_view message,
const Ts &...
args)
const {
482 template <
typename...
Ts>
487 template <
typename...
Ts>
495 template <std::
size_t precision = log::default_precision,
typename T>
527 std::string_view
msg)
const {
533 molpro::cout <<
"[WARNING]";
537 molpro::cout <<
"[ERROR]:";
541 molpro::cout <<
"[FATAL]:";
549 molpro::cout <<
"[INFO]";
553 molpro::cout <<
"[DEBUG]";
557 molpro::cout <<
"[TRACE]";
563 molpro::cout <<
"[" <<
ctx <<
"]";
569 molpro::cout << std::endl;
571 molpro::cout <<
"\n";
579 const std::type_info *context;
584 return severity >= filter.
min_severity.value_or(m_min_severity) &&
585 verbosity >= filter.verbosity.value_or(m_verbosity) &&
586 (!
data_dump || filter.data_dumps.value_or(m_dump_data));
592 for (
const auto &
entry : m_sinks)
598 void dispatch(
const log::Record &
record)
const {
600 for (
const auto &
entry : m_sinks)
613 bool m_dump_data =
false;
615 bool m_default_output =
true;
617 std::vector<SinkEntry> m_sinks;
Logger class implementation. Provides (customizable) logging functionalities.
Definition Logger.h:370
void set_min_severity(log::Severity severity)
Definition Logger.h:503
void fatal(std::string_view message, const Ts &...args) const
Definition Logger.h:488
bool is_wanted(log::Severity severity, log::Verbosity verbosity) const
Definition Logger.h:429
void msg(log::Severity severity, log::Verbosity verbosity, std::string_view message, const Ts &...args) const
Logs a free-text message (context log::Generic). The arguments are stringified and appended.
Definition Logger.h:446
Logger(log::Severity min_severity=log::Severity::Normal, log::Verbosity verbosity=log::Verbosity::Info, bool enable_data_dumps=false)
Definition Logger.h:375
void info(std::string_view message, const Ts &...args) const
Definition Logger.h:473
void warn(std::string_view message, const Ts &...args) const
Definition Logger.h:478
void emit(log::Severity severity, log::Verbosity verbosity, std::string_view message) const
Emits an event of a context whose payload is default-constructible (usually empty)
Definition Logger.h:438
std::function< void(const log::Record &)> Sink
Definition Logger.h:372
void trace(std::string_view message, const Ts &...args) const
Definition Logger.h:463
log::Verbosity verbosity() const
Definition Logger.h:505
void error(std::string_view message, const Ts &...args) const
Definition Logger.h:483
SinkId add_sink(Sink sink, log::Filter filter={})
Registers a sink receiving all events that pass the given filter.
Definition Logger.h:384
void emit(log::Severity severity, log::Verbosity verbosity, std::string_view message, MakePayload &&make) const
Emits an event of context Ctx.
Definition Logger.h:417
void remove_sink(SinkId id)
Removes a previously registered sink.
Definition Logger.h:406
bool default_output() const
Definition Logger.h:513
virtual void default_message_handler(std::string_view ctx, log::Severity severity, log::Verbosity verbosity, std::string_view msg) const
Built-in text output. Receives every event passing the logger's thresholds and data-dump flag.
Definition Logger.h:526
bool data_dumps_enabled() const
Definition Logger.h:509
std::size_t SinkId
Definition Logger.h:373
void set_default_output(bool enable)
Switches the built-in text output (default_message_handler()) on or off.
Definition Logger.h:518
log::Severity min_severity() const
Definition Logger.h:501
void debug(std::string_view message, const Ts &...args) const
Definition Logger.h:468
void data_dump(std::string_view what, const T &data) const
Dumps data (context log::DataDump<T>, verbosity Trace). Nothing is copied.
Definition Logger.h:496
SinkId on(F &&f)
Registers f(const log::Record &, const Ctx::Payload &) to be called for every event of context Ctx.
Definition Logger.h:397
void enable_data_dumps(bool enable)
Definition Logger.h:511
virtual ~Logger()=default
void set_verbosity(log::Verbosity verbosity)
Definition Logger.h:507
A single logged event, as passed to sinks.
Definition Logger.h:287
std::string_view message
The message without the payload's text representation.
Definition Logger.h:292
bool is_data_dump() const
Definition Logger.h:323
Severity severity
Definition Logger.h:290
const Ctx::Payload * get() const
Definition Logger.h:311
static Record make(Severity severity, Verbosity verbosity, std::string_view message, const typename Ctx::Payload &payload)
Definition Logger.h:326
bool is() const
Definition Logger.h:303
const std::type_info & type() const
Definition Logger.h:297
std::string text() const
Definition Logger.h:318
Verbosity verbosity
Definition Logger.h:291
std::string_view context
Name of the context.
Definition Logger.h:289
consteval bool is_stringifiable()
Mirrors the branches of stringify(), in the same order.
Definition Logger.h:146
consteval bool is_printable_range()
Whether T is a range whose elements are of a different type than T (to exclude e.g....
Definition Logger.h:137
Definition IterativeSolverTemplate.h:82
constexpr const std::size_t default_precision
Definition Logger.h:83
decltype(std::abs(std::declval< Scalar >())) real_t
Definition Logger.h:89
std::string compose(std::string_view message, std::string_view suffix)
Definition Logger.h:276
std::string stringify(const T &t, std::size_t precision=default_precision)
Converts the given object into a string.
Definition Logger.h:178
Verbosity
Different levels of logging.
Definition Logger.h:63
Severity
Severity of a given message.
Definition Logger.h:73
4-parameter interpolation of a 1-dimensional function given two points for which function values and ...
Definition helper.h:14
std::unique_ptr< LinearEigensystem< R, Q, P > > create_LinearEigensystem(const LinearEigensystemOptions &options, const std::shared_ptr< ArrayHandlers< R, Q, P > > &handlers=std::make_shared< molpro::linalg::itsolv::ArrayHandlers< R, Q, P > >())
Definition SolverFactory.h:111
std::size_t precision
Requested precision (default_precision if unspecified)
Definition Logger.h:264
const T & data
The dumped data.
Definition Logger.h:263
static constexpr bool is_data_dump
Definition Logger.h:261
static std::string format(const Payload &p)
Definition Logger.h:266
static constexpr std::string_view name
Definition Logger.h:260
Selects which events an untyped sink receives. Unset fields inherit the logger's current settings.
Definition Logger.h:352
static Filter all()
A filter that lets everything pass.
Definition Logger.h:358
std::optional< bool > data_dumps
Whether data dumps are passed on.
Definition Logger.h:355
std::optional< Severity > min_severity
Lowest severity that is passed on.
Definition Logger.h:353
std::optional< Verbosity > verbosity
Lowest verbosity that is passed on.
Definition Logger.h:354
static constexpr std::string_view name
Definition Logger.h:251