rstd 0.1.0
Loading...
Searching...
No Matches
macro.hpp
1#pragma once
2
3#if defined(_WIN32)
4# define RSTD_OS_WINDOWS 1
5#endif
6
7#if defined(__linux__)
8# define RSTD_OS_LINUX 1
9#endif
10
11#if defined(__APPLE__)
12# define RSTD_OS_APPLE 1
13#endif
14
15#if defined(__unix__) || defined(__APPLE__)
16# define RSTD_OS_UNIX 1
17#endif
18
19#define USE_TRAIT(Class) \
20 using Self = Class; \
21 template<typename, typename> \
22 friend struct rstd::Impl; \
23 template<typename _USE_TRAIT_T> \
24 requires rstd::Impled<Self, rstd::cmp::PartialEq<_USE_TRAIT_T>> \
25 friend bool operator==(const Self& a, const _USE_TRAIT_T& b) noexcept { \
26 return as<rstd::cmp::PartialEq<_USE_TRAIT_T>>(a).eq(b); \
27 }
28
29#define RSTD_STR(a, ...) #a
30#define RSTD_FIRST(a, ...) a
31#define RSTD_REST(a, ...) __VA_ARGS__
32
33#define RSTD_REST_ARGS(a, ...) __VA_OPT__(, ) __VA_ARGS__
34
35#ifdef NDEBUG
36# define debug_assert(...) ((void)0)
37# define debug_assert_eq(...) ((void)0)
38#else
39# define debug_assert(EXP, ...) \
40 if (! (EXP)) rstd::panic(#EXP RSTD_STR(__VA_ARGS__) RSTD_REST_ARGS(__VA_ARGS__))
41# define debug_assert_eq(A, B) debug_assert((A) == (B))
42#endif
43
44#define rstd_assert(EXP, ...) \
45 if (! (EXP)) rstd::panic(#EXP RSTD_STR(__VA_ARGS__) RSTD_REST_ARGS(__VA_ARGS__))
46#define rstd_assert_eq(A, B) rstd_assert((A) == (B))
47
48#define rstd_error(...) \
49 do { \
50 if (rstd::log::log_enabled(rstd::log::Level::Error, "")) { \
51 rstd::log::error(__VA_ARGS__); \
52 } \
53 } while (0)
54
55#define rstd_warn(...) \
56 do { \
57 if (rstd::log::log_enabled(rstd::log::Level::Warn, "")) { \
58 rstd::log::warn(__VA_ARGS__); \
59 } \
60 } while (0)
61
62#define rstd_info(...) \
63 do { \
64 if (rstd::log::log_enabled(rstd::log::Level::Info, "")) { \
65 rstd::log::info(__VA_ARGS__); \
66 } \
67 } while (0)
68
69#ifdef NDEBUG
70# define rstd_debug(...) ((void)0)
71#else
72# define rstd_debug(...) \
73 do { \
74 if (rstd::log::log_enabled(rstd::log::Level::Debug, "")) { \
75 rstd::log::debug(__VA_ARGS__); \
76 } \
77 } while (0)
78#endif
79
80#define rstd_trace(...) \
81 do { \
82 if (rstd::log::log_enabled(rstd::log::Level::Trace, "")) { \
83 rstd::log::trace(__VA_ARGS__); \
84 } \
85 } while (0)
86
87// Target-specific macros
88#define rstd_error_t(TARGET, ...) \
89 do { \
90 if (rstd::log::log_enabled(rstd::log::Level::Error, TARGET)) { \
91 rstd::log::error(TARGET, __VA_ARGS__); \
92 } \
93 } while (0)
94
95#define rstd_warn_t(TARGET, ...) \
96 do { \
97 if (rstd::log::log_enabled(rstd::log::Level::Warn, TARGET)) { \
98 rstd::log::warn(TARGET, __VA_ARGS__); \
99 } \
100 } while (0)
101
102#define rstd_info_t(TARGET, ...) \
103 do { \
104 if (rstd::log::log_enabled(rstd::log::Level::Info, TARGET)) { \
105 rstd::log::info(TARGET, __VA_ARGS__); \
106 } \
107 } while (0)
108
109#ifdef NDEBUG
110# define rstd_debug_t(...) ((void)0)
111#else
112# define rstd_debug_t(TARGET, ...) \
113 do { \
114 if (rstd::log::log_enabled(rstd::log::Level::Debug, TARGET)) { \
115 rstd::log::debug(TARGET, __VA_ARGS__); \
116 } \
117 } while (0)
118#endif
119
120#define rstd_trace_t(TARGET, ...) \
121 do { \
122 if (rstd::log::log_enabled(rstd::log::Level::Trace, TARGET)) { \
123 rstd::log::trace(TARGET, __VA_ARGS__); \
124 } \
125 } while (0)