15hi_warning_ignore_msvc(26490);
17namespace hi::inline
v1 {
18enum class global_state_type : uint64_t {
21 log_statistics = 0x04,
28 log_mask = log_debug | log_info | log_statistics | log_trace | log_audit | log_warning | log_error | log_fatal,
30 log_level_default = log_audit | log_error | log_fatal,
31 log_level_fatal = log_audit | log_fatal,
32 log_level_error = log_trace | log_error | log_level_fatal,
33 log_level_warning = log_warning | log_level_error,
34 log_level_info = log_info | log_statistics | log_level_warning,
35 log_level_debug = log_debug | log_level_info,
37 log_is_running = 0x1'00,
38 time_stamp_utc_is_running = 0x2'00,
40 system_is_running = 0x1'000000'00,
41 system_is_shutting_down = 0x2'000000'00,
42 system_mask = system_is_running | system_is_shutting_down,
45[[nodiscard]]
constexpr global_state_type operator|(global_state_type lhs, global_state_type rhs)
noexcept
47 return static_cast<global_state_type
>(to_underlying(lhs) | to_underlying(rhs));
50[[nodiscard]]
constexpr global_state_type operator&(global_state_type lhs, global_state_type rhs)
noexcept
52 return static_cast<global_state_type
>(to_underlying(lhs) & to_underlying(rhs));
55[[nodiscard]]
constexpr global_state_type operator~(global_state_type rhs)
noexcept
57 return static_cast<global_state_type
>(~to_underlying(rhs));
60[[nodiscard]]
constexpr bool to_bool(global_state_type rhs)
noexcept
62 return to_bool(to_underlying(rhs));
65[[nodiscard]]
constexpr bool is_system_running(global_state_type rhs)
noexcept
67 return (rhs & global_state_type::system_mask) == global_state_type::system_is_running;
70[[nodiscard]]
constexpr bool is_system_shutting_down(global_state_type rhs)
noexcept
72 return to_bool(rhs & global_state_type::system_is_shutting_down);
79 using value_type = hi::global_state_type;
83 static constexpr bool is_always_lock_free = atomic_type::is_always_lock_free;
85 constexpr atomic()
noexcept =
default;
91 constexpr atomic(value_type desired) noexcept : v(to_underlying(desired)) {}
98 void store(value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
100 return v.
store(hi::to_underlying(desired), order);
103 [[nodiscard]] value_type
load(std::memory_order order = std::memory_order::seq_cst)
const noexcept
105 return static_cast<value_type
>(v.
load(order));
108 [[nodiscard]] value_type
exchange(value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
110 return static_cast<value_type
>(v.
exchange(hi::to_underlying(desired), order));
114 compare_exchange_weak(value_type& expected, value_type desired, std::memory_order success, std::memory_order failure)
noexcept
117 reinterpret_cast<underlying_type_t<value_type>&
>(expected), hi::to_underlying(desired), success, failure);
121 compare_exchange_weak(value_type& expected, value_type desired, std::memory_order order = std::memory_order::seq_cst)
noexcept
127 value_type& expected,
129 std::memory_order success,
130 std::memory_order failure)
noexcept
133 reinterpret_cast<underlying_type_t<value_type>&
>(expected), hi::to_underlying(desired), success, failure);
137 value_type& expected,
139 std::memory_order order = std::memory_order::seq_cst)
noexcept
144 value_type
fetch_and(value_type arg, std::memory_order order = std::memory_order::seq_cst)
noexcept
146 return static_cast<value_type
>(v.
fetch_and(hi::to_underlying(arg), order));
149 value_type
fetch_or(value_type arg, std::memory_order order = std::memory_order::seq_cst)
noexcept
151 return static_cast<value_type
>(v.
fetch_or(hi::to_underlying(arg), order));
154 operator value_type()
const noexcept
159 value_type
operator=(value_type desired)
noexcept
165 value_type
operator|=(value_type arg)
noexcept
170 value_type
operator&=(value_type arg)
noexcept
176namespace hi::inline
v1 {
189[[nodiscard]]
inline bool is_system_running() noexcept
191 return is_system_running(
global_state.load(std::memory_order::relaxed));
194[[nodiscard]]
inline bool is_system_shutting_down() noexcept
196 return is_system_shutting_down(global_state.load(std::memory_order::relaxed));
199inline void set_log_level(global_state_type log_level)
noexcept
202 hi_assert(not to_bool(log_level & ~global_state_type::log_mask));
206 global_state &= (~global_state_type::log_mask | log_level);
215inline bool global_state_disable(global_state_type subsystem, std::memory_order order = std::memory_order::seq_cst)
noexcept
217 hi_assert(std::popcount(to_underlying(subsystem)) == 1);
218 return to_bool(
global_state.fetch_and(~subsystem, order) & subsystem);
227inline bool global_state_enable(global_state_type subsystem, std::memory_order order = std::memory_order::seq_cst)
noexcept
229 hi_assert(std::popcount(to_underlying(subsystem)) == 1);
230 return to_bool(
global_state.fetch_or(subsystem, order) & subsystem);
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:87
DOXYGEN BUG.
Definition algorithm.hpp:15
bool global_state_disable(global_state_type subsystem, std::memory_order order=std::memory_order::seq_cst) noexcept
Disable a subsystem.
Definition global_state.hpp:215
std::atomic< global_state_type > global_state
The global state of the hikogui framework.
Definition global_state.hpp:187
bool global_state_enable(global_state_type subsystem, std::memory_order order=std::memory_order::seq_cst) noexcept
Enable a subsystem.
Definition global_state.hpp:227
geometry/margins.hpp
Definition assert.hpp:18
T compare_exchange_weak(T... args)
T is_lock_free(T... args)