1
1
#pragma once
2
2
3
3
#include < log/env.hpp>
4
+ #include < log/flavor.hpp>
4
5
#include < log/level.hpp>
5
6
#include < log/module.hpp>
6
7
#include < sc/format.hpp>
9
10
#include < stdx/compiler.hpp>
10
11
#include < stdx/ct_string.hpp>
11
12
#include < stdx/panic.hpp>
13
+ #include < stdx/type_traits.hpp>
14
+ #include < stdx/utility.hpp>
12
15
13
16
#include < cstdint>
14
17
#include < utility>
@@ -35,35 +38,33 @@ struct config {
35
38
36
39
template <typename ...> inline auto config = null::config{};
37
40
38
- struct default_flavor_t ;
39
-
40
- template <typename Flavor, typename ... Ts>
41
+ template <typename Env, typename ... Ts>
41
42
ALWAYS_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 >) {
43
45
return config<Ts...>;
44
46
} else {
45
- return config<Flavor , Ts...>;
47
+ return config<flavor_t , Ts...>;
46
48
}
47
49
}
48
50
49
- template <typename Flavor, typename Env, typename ... Ts, typename ... TArgs>
51
+ template <typename Env, typename ... Ts, typename ... TArgs>
50
52
ALWAYS_INLINE static auto log (TArgs &&...args) -> void {
51
- auto &cfg = get_config<Flavor , Ts...>();
53
+ auto &cfg = get_config<Env , Ts...>();
52
54
cfg.logger .template log <Env>(std::forward<TArgs>(args)...);
53
55
}
54
56
} // namespace logging
55
57
56
58
// NOLINTBEGIN(cppcoreguidelines-macro-usage)
57
59
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 >( \
60
62
__FILE__, __LINE__, sc::format(MSG##_sc __VA_OPT__ (, ) __VA_ARGS__))
61
63
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__))
67
68
68
69
#define CIB_TRACE (...) \
69
70
CIB_LOG_WITH_LEVEL (logging::level::TRACE __VA_OPT__ (, ) __VA_ARGS__)
@@ -77,8 +78,7 @@ ALWAYS_INLINE static auto log(TArgs &&...args) -> void {
77
78
#define CIB_FATAL (MSG, ...) \
78
79
[](auto &&str) { \
79
80
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); \
82
82
FWD (str).apply ([]<typename S, typename ... Args>(S s, Args... args) { \
83
83
constexpr auto cts = stdx::ct_string_from_type (s); \
84
84
stdx::panic<cts>(args...); \
@@ -89,9 +89,9 @@ ALWAYS_INLINE static auto log(TArgs &&...args) -> void {
89
89
((expr) ? void(0 ) : CIB_FATAL(" Assertion failure: " #expr))
90
90
91
91
namespace logging {
92
- template <typename Flavor , typename ... Ts>
92
+ template <typename Env , typename ... Ts>
93
93
ALWAYS_INLINE static auto log_version () -> void {
94
- auto &l_cfg = get_config<Flavor , Ts...>();
94
+ auto &l_cfg = get_config<Env , Ts...>();
95
95
auto &v_cfg = ::version::config<Ts...>;
96
96
if constexpr (requires {
97
97
l_cfg.logger .template log_build <v_cfg.build_id ,
@@ -109,7 +109,9 @@ ALWAYS_INLINE static auto log_version() -> void {
109
109
}
110
110
} // namespace logging
111
111
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>{}>>()
113
115
#define CIB_LOG_VERSION () CIB_LOG_V(logging::default_flavor_t )
114
116
115
117
// NOLINTEND(cppcoreguidelines-macro-usage)
0 commit comments