|
28 | 28 | #include <iostream> |
29 | 29 | #include <type_traits> |
30 | 30 |
|
31 | | -// If use_default is true the check becomes constexpr. Therefore the compiler |
32 | | -// can optimize the branch containing the logging instructions in case of |
33 | | -// inactivity completely away. If you want the level to be configurable at |
34 | | -// runtime you need to pay for it by having the instructions in your code. |
| 31 | +// helper |
| 32 | +#define _EXT_LOG_SELECT5TH_PARAMETER(_1, _2, _3, _4, NAME, ...) NAME |
| 33 | + |
35 | 34 |
|
36 | | -// non static |
| 35 | +// variable logging - if() ... |
37 | 36 | #define _EXT_LOG_INTERNAL(id_, topic_, macro_level_, cond_) \ |
38 | | - if (ext::logging::_detail::level_is_active((macro_level_), (topic_)) && cond_) \ |
| 37 | + if (ext::logging::_detail::variable_level_is_active((macro_level_), (topic_)) && cond_) \ |
39 | 38 | ext::logging::_detail::logger(id_, (topic_), (macro_level_), __FILE__, __LINE__, __FUNCTION__) |
40 | 39 |
|
41 | | -// static |
42 | | -#define _EXT_LOG_INTERNAL_STATIC(id_, topic_, macro_level_, cond_) \ |
43 | | - if constexpr (ext::logging::_detail::default_level_is_active((macro_level_)) \ |
44 | | - ext::logging::_detail::logger(id_, (topic_), (macro_level_), __FILE__, __LINE__, __FUNCTION__) |
45 | | - |
46 | 40 | #define _EXT_LOG_INTERNAL_ADD_PREFIX(id_, topic_, macro_level_, cond_) \ |
47 | 41 | _EXT_LOG_INTERNAL(id_, (ext::logging::topic::topic_), (ext::logging::level::macro_level_), cond_) |
48 | 42 |
|
49 | | -#define _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC(id_, topic_, macro_level_, cond_) \ |
50 | | - _EXT_LOG_INTERNAL(id_, (ext::logging::topic::topic_), (ext::logging::level::macro_level_), cond_) |
51 | | - |
52 | | -#define _EXT_LOG_SELECT5TH_PARAMETER(_1, _2, _3, _4, NAME, ...) NAME |
53 | | - |
54 | | -// constexpr macros |
55 | | -#define EXT_LOGVARIABLE4(id, topic_, macro_level_, cond_) _EXT_LOG_INTERNAL_ADD_PREFIX(id, no_topic, macro_level_, cond_) |
56 | | - |
| 43 | +#define EXT_LOGVARIABLE4(id, topic_, macro_level_, cond_) _EXT_LOG_INTERNAL_ADD_PREFIX(id, topic_, macro_level_, cond_) |
57 | 44 | #define EXT_LOGVARIABLE3(id, topic_, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX(id, topic_, macro_level_, true) |
58 | | - |
59 | 45 | #define EXT_LOGVARIABLE2(id, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX(id, no_topic, macro_level_, true) |
60 | | - |
61 | 46 | #define EXT_LOGVARIABLE1(id) _EXT_LOG_INTERNAL_ADD_PREFIX(id, no_topic, EXT_LOGGING_DEFAULT_LEVEL, true) |
62 | 47 |
|
63 | | -#define EXT_DEVC _EXT_LOG_INTERNAL_ADD_PREFIX("@@@@", dev, EXT_LOGGING_DEFAULT_LEVEL, true) |
64 | | - |
65 | 48 | // 1st __VA_ARGS__ shifts the args into the correct position |
66 | 49 | // macro can not be empty because of the leading `,` (fixed with __VA_OPT__ in c++20) |
67 | 50 | #ifdef EXT_COMPILER_VC |
|
76 | 59 | (__VA_ARGS__) |
77 | 60 | #endif // EXT_COMPILER_VC |
78 | 61 |
|
79 | | -// runtime configurable macros |
80 | | -#define EXT_LOGSTATIC4(id, topic_, macro_level_, cond_) \ |
81 | | - _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC(id, no_topic, macro_level_, cond_) |
| 62 | +#define EXT_DEV_VARIABLE _EXT_LOG_INTERNAL_ADD_PREFIX("$$$$", dev, EXT_LOGGING_DEFAULT_LEVEL, true) |
| 63 | +#define EXT_DEV_IF(cond_) _EXT_LOG_INTERNAL_ADD_PREFIX("$$$$", dev, EXT_LOGGING_DEFAULT_LEVEL, cond_) |
| 64 | +#define EXT_LOG EXT_LOGVARIABLE |
82 | 65 |
|
83 | | -#define EXT_LOGSTATIC3(id, topic_, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC(id, topic_, macro_level_, true) |
84 | 66 |
|
85 | | -#define EXT_LOGSTATIC2(id, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC(id, no_topic, macro_level_, true) |
| 67 | +// This is still a bit experimental: |
| 68 | +// constexpr if() does not seem to work in a macro is there some way that guarantees the evaluation |
| 69 | +// at compile time. Otherwise it would be better to remove this code in order to reduce the complexity. |
| 70 | + |
| 71 | +#define _EXT_LOG_INTERNAL_CONST(id_, topic_, macro_level_, cond_) \ |
| 72 | + if constexpr (ext::logging::_detail::constexpr_level_is_active(macro_level_) && cond_) \ |
| 73 | + ext::logging::_detail::logger(id_, (topic_), (macro_level_), __FILE__, __LINE__, __FUNCTION__) |
86 | 74 |
|
87 | | -#define EXT_LOGSTATIC1(id) _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC(id, no_topic, EXT_LOGGING_DEFAULT_LEVEL, true) |
| 75 | +#define _EXT_LOG_INTERNAL_ADD_PREFIX_CONST(id_, topic_, macro_level_, cond_) \ |
| 76 | + _EXT_LOG_INTERNAL_CONST(id_, (ext::logging::topic::topic_), (ext::logging::level::macro_level_), cond_) |
88 | 77 |
|
89 | | -#define EXT_DEVV _EXT_LOG_INTERNAL_ADD_PREFIX_STATIC("$$$$", dev, EXT_LOGGING_DEFAULT_LEVEL, true) |
90 | 78 |
|
91 | | -#define EXT_LOGSTATIC(...) \ |
92 | | - _EXT_LOG_SELECT5TH_PARAMETER(__VA_ARGS__, EXT_LOGSTATIC4, EXT_LOGSTATIC3, EXT_LOGSTATIC2, EXT_LOGSTATIC1, ) \ |
| 79 | +#define EXT_LOGCONST4(id, topic_, macro_level_, cond_) \ |
| 80 | + _EXT_LOG_INTERNAL_ADD_PREFIX_CONST(id, topic_, macro_level_, cond_) |
| 81 | + |
| 82 | +#define EXT_LOGCONST3(id, topic_, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX_CONST(id, topic_, macro_level_, true) |
| 83 | +#define EXT_LOGCONST2(id, macro_level_) _EXT_LOG_INTERNAL_ADD_PREFIX_CONST(id, no_topic, macro_level_, true) |
| 84 | +#define EXT_LOGCONST1(id) _EXT_LOG_INTERNAL_ADD_PREFIX_CONST(id, no_topic, EXT_LOGGING_DEFAULT_LEVEL, true) |
| 85 | + |
| 86 | +#define EXT_LOGCONST(...) \ |
| 87 | + _EXT_LOG_SELECT5TH_PARAMETER(__VA_ARGS__, EXT_LOGCONST4, EXT_LOGCONST3, EXT_LOGCONST2, EXT_LOGCONST1, ) \ |
93 | 88 | (__VA_ARGS__) |
94 | 89 |
|
95 | | -// set default macros |
96 | | -#define EXT_LOG EXT_LOGVARIABLE |
97 | | -#define EXT_LOG_STATIC EXT_LOGSTATIC |
98 | | -#define EXT_DEV EXT_DEVC |
| 90 | +#define EXT_DEV _EXT_LOG_INTERNAL_ADD_PREFIX_CONST("@@@@", dev, EXT_LOGGING_DEFAULT_LEVEL, true) |
| 91 | +#define EXT_DEV_IF_CONST(cond_) _EXT_LOG_INTERNAL_ADD_PREFIX_CONST("@@@@", dev, EXT_LOGGING_DEFAULT_LEVEL, cond_) |
| 92 | +#define EXT_LOG_CONST EXT_LOGCONST |
| 93 | + |
99 | 94 |
|
100 | 95 | #endif // EXT_LOGGING_HEADER |
0 commit comments