11#pragma once
22
33#include < log/env.hpp>
4+ #include < log/flavor.hpp>
45#include < log/level.hpp>
56#include < log/module.hpp>
67#include < sc/format.hpp>
910#include < stdx/compiler.hpp>
1011#include < stdx/ct_string.hpp>
1112#include < stdx/panic.hpp>
13+ #include < stdx/type_traits.hpp>
14+ #include < stdx/utility.hpp>
1215
1316#include < cstdint>
1417#include < utility>
@@ -35,35 +38,33 @@ struct config {
3538
3639template <typename ...> inline auto config = null::config{};
3740
38- struct default_flavor_t ;
39-
40- template <typename Flavor, typename ... Ts>
41+ template <typename Env, typename ... Ts>
4142ALWAYS_INLINE constexpr static auto get_config () -> auto & {
42- if constexpr (std::same_as<Flavor, default_flavor_t >) {
43+ using flavor_t = typename decltype (get_flavor (Env{}).value )::type;
44+ if constexpr (std::same_as<flavor_t , default_flavor_t >) {
4345 return config<Ts...>;
4446 } else {
45- return config<Flavor , Ts...>;
47+ return config<flavor_t , Ts...>;
4648 }
4749}
4850
49- template <typename Flavor, typename Env, typename ... Ts, typename ... TArgs>
51+ template <typename Env, typename ... Ts, typename ... TArgs>
5052ALWAYS_INLINE static auto log (TArgs &&...args) -> void {
51- auto &cfg = get_config<Flavor , Ts...>();
53+ auto &cfg = get_config<Env , Ts...>();
5254 cfg.logger .template log <Env>(std::forward<TArgs>(args)...);
5355}
5456} // namespace logging
5557
5658// NOLINTBEGIN(cppcoreguidelines-macro-usage)
5759
58- #define CIB_LOG (FLAVOR, MSG, ...) \
59- logging::log<FLAVOR, cib_log_env_t >( \
60+ #define CIB_LOG (MSG, ...) \
61+ logging::log<cib_log_env_t >( \
6062 __FILE__, __LINE__, sc::format(MSG##_sc __VA_OPT__ (, ) __VA_ARGS__))
6163
62- #define CIB_LOG_WITH_LEVEL (LEVEL, ...) \
63- do { \
64- CIB_LOG_ENV (logging::get_level, LEVEL); \
65- CIB_LOG (logging::default_flavor_t __VA_OPT__ (, ) __VA_ARGS__); \
66- } while (false )
64+ #define CIB_LOG_WITH_LEVEL (LEVEL, MSG, ...) \
65+ logging::log< \
66+ logging::extend_env_t <cib_log_env_t , logging::get_level, LEVEL>>( \
67+ __FILE__, __LINE__, sc::format(MSG##_sc __VA_OPT__ (, ) __VA_ARGS__))
6768
6869#define CIB_TRACE (...) \
6970 CIB_LOG_WITH_LEVEL (logging::level::TRACE __VA_OPT__ (, ) __VA_ARGS__)
@@ -77,8 +78,7 @@ ALWAYS_INLINE static auto log(TArgs &&...args) -> void {
7778#define CIB_FATAL (MSG, ...) \
7879 [](auto &&str) { \
7980 CIB_LOG_ENV (logging::get_level, logging::level::FATAL); \
80- logging::log<logging::default_flavor_t , cib_log_env_t >(__FILE__, \
81- __LINE__, str); \
81+ logging::log<cib_log_env_t >(__FILE__, __LINE__, str); \
8282 FWD (str).apply ([]<typename S, typename ... Args>(S s, Args... args) { \
8383 constexpr auto cts = stdx::ct_string_from_type (s); \
8484 stdx::panic<cts>(args...); \
@@ -89,9 +89,9 @@ ALWAYS_INLINE static auto log(TArgs &&...args) -> void {
8989 ((expr) ? void(0 ) : CIB_FATAL(" Assertion failure: " #expr))
9090
9191namespace logging {
92- template <typename Flavor , typename ... Ts>
92+ template <typename Env , typename ... Ts>
9393ALWAYS_INLINE static auto log_version () -> void {
94- auto &l_cfg = get_config<Flavor , Ts...>();
94+ auto &l_cfg = get_config<Env , Ts...>();
9595 auto &v_cfg = ::version::config<Ts...>;
9696 if constexpr (requires {
9797 l_cfg.logger .template log_build <v_cfg.build_id ,
@@ -109,7 +109,9 @@ ALWAYS_INLINE static auto log_version() -> void {
109109}
110110} // namespace logging
111111
112- #define CIB_LOG_V (FLAVOR ) logging::log_version<FLAVOR>()
112+ #define CIB_LOG_V (FLAVOR ) \
113+ logging::log_version<logging::extend_env_t < \
114+ cib_log_env_t , logging::get_flavor, stdx::type_identity<FLAVOR>{}>>()
113115#define CIB_LOG_VERSION () CIB_LOG_V(logging::default_flavor_t )
114116
115117// NOLINTEND(cppcoreguidelines-macro-usage)
0 commit comments