12namespace hi::inline v1 {
14enum class global_state_type : uint64_t {
17 log_statistics = 0x04,
24 log_mask = log_debug | log_info | log_statistics | log_trace | log_audit | log_warning | log_error | log_fatal,
26 log_level_default = log_audit | log_error | log_fatal,
27 log_level_fatal = log_audit | log_fatal,
28 log_level_error = log_trace | log_error | log_level_fatal,
29 log_level_warning = log_warning | log_level_error,
30 log_level_info = log_info | log_statistics | log_level_warning,
31 log_level_debug = log_debug | log_level_info,
33 log_is_running = 0x1'00,
34 time_stamp_utc_is_running = 0x2'00,
36 system_is_running = 0x1'000000'00,
37 system_is_shutting_down = 0x2'000000'00,
38 system_mask = system_is_running | system_is_shutting_down,
41[[nodiscard]]
constexpr global_state_type
operator|(global_state_type lhs, global_state_type rhs)
noexcept
43 return static_cast<global_state_type
>(to_underlying(lhs) | to_underlying(rhs));
46[[nodiscard]]
constexpr global_state_type operator&(global_state_type lhs, global_state_type rhs)
noexcept
48 return static_cast<global_state_type
>(to_underlying(lhs) & to_underlying(rhs));
51[[nodiscard]]
constexpr global_state_type operator~(global_state_type rhs)
noexcept
53 return static_cast<global_state_type
>(~to_underlying(rhs));
56[[nodiscard]]
constexpr bool to_bool(global_state_type rhs)
noexcept
58 return static_cast<bool>(to_underlying(rhs));
61[[nodiscard]]
constexpr bool is_system_running(global_state_type rhs)
noexcept
63 return (rhs & global_state_type::system_mask) == global_state_type::system_is_running;
66[[nodiscard]]
constexpr bool is_system_shutting_down(global_state_type rhs)
noexcept
68 return to_bool(rhs & global_state_type::system_is_shutting_down);
75 using value_type = hi::global_state_type;
79 static constexpr bool is_always_lock_free = atomic_type::is_always_lock_free;
81 constexpr atomic()
noexcept =
default;
87 constexpr atomic(value_type desired) noexcept : v(to_underlying(desired)) {}
94 void store(value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
96 return v.
store(hi::to_underlying(desired), order);
99 [[nodiscard]] value_type
load(std::memory_order order = std::memory_order::seq_cst)
const noexcept
101 return static_cast<value_type
>(v.
load(order));
104 [[nodiscard]] value_type
exchange(value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
106 return static_cast<value_type
>(v.
exchange(hi::to_underlying(desired), order));
110 compare_exchange_weak(value_type &expected, value_type desired, std::memory_order success, std::memory_order failure)
noexcept
113 reinterpret_cast<underlying_type_t<value_type> &
>(expected), hi::to_underlying(desired), success, failure);
117 compare_exchange_weak(value_type &expected, value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
123 value_type &expected,
125 std::memory_order success,
126 std::memory_order failure)
noexcept
129 reinterpret_cast<underlying_type_t<value_type> &
>(expected), hi::to_underlying(desired), success, failure);
133 value_type &expected,
135 std::memory_order order = std::memory_order::seq_cst)
noexcept
140 value_type
fetch_and(value_type arg, std::memory_order order = std::memory_order::seq_cst)
noexcept
142 return static_cast<value_type
>(v.
fetch_and(hi::to_underlying(arg), order));
145 value_type
fetch_or(value_type arg, std::memory_order order = std::memory_order::seq_cst)
noexcept
147 return static_cast<value_type
>(v.
fetch_or(hi::to_underlying(arg), order));
150 operator value_type()
const noexcept
155 value_type
operator=(value_type desired)
noexcept
161 value_type
operator|=(value_type arg)
noexcept
166 value_type
operator&=(value_type arg)
noexcept
172namespace hi::inline v1 {
185[[nodiscard]]
inline bool is_system_running() noexcept
187 return is_system_running(global_state.load(std::memory_order::relaxed));
190[[nodiscard]]
inline bool is_system_shutting_down() noexcept
192 return is_system_shutting_down(global_state.load(std::memory_order::relaxed));
195[[nodiscard]]
inline void set_log_level(global_state_type log_level)
noexcept
198 hi_axiom(not to_bool(log_level & ~global_state_type::log_mask));
201 global_state |= log_level;
202 global_state &= (~global_state_type::log_mask | log_level);
210inline bool global_state_disable(global_state_type subsystem, std::memory_order order = std::memory_order::seq_cst)
noexcept
212 hi_axiom(std::popcount(to_underlying(subsystem)) == 1);
213 return to_bool(global_state.fetch_and(~subsystem, order) & subsystem);
221inline bool global_state_enable(global_state_type subsystem, std::memory_order order = std::memory_order::seq_cst)
noexcept
223 hi_axiom(std::popcount(to_underlying(subsystem)) == 1);
224 return to_bool(global_state.fetch_or(subsystem, order) & subsystem);
constexpr alignment operator|(horizontal_alignment lhs, vertical_alignment rhs) noexcept
Combine vertical and horizontal alignment.
Definition alignment.hpp:200
T compare_exchange_weak(T... args)
T is_lock_free(T... args)