16class RelaxedCounter final {
20 constexpr RelaxedCounter()
noexcept =
default;
21 constexpr RelaxedCounter(T desired)
noexcept : val_(desired) {}
23 RelaxedCounter(
const RelaxedCounter& other)
noexcept : val_(other.Load()) {}
25 RelaxedCounter& operator=(
const RelaxedCounter& other)
noexcept {
34 RelaxedCounter& operator=(T desired)
noexcept {
39 void Store(T desired)
noexcept { val_.store(desired, std::memory_order_relaxed); }
41 T Load()
const noexcept {
return val_.load(std::memory_order_relaxed); }
43 operator T()
const noexcept {
return Load(); }
45 RelaxedCounter& operator++()
noexcept {
46 val_.fetch_add(1, std::memory_order_relaxed);
50 T operator++(
int)
noexcept {
return val_.fetch_add(1, std::memory_order_relaxed); }
52 RelaxedCounter& operator--()
noexcept {
53 val_.fetch_sub(1, std::memory_order_relaxed);
57 T operator--(
int)
noexcept {
return val_.fetch_sub(1, std::memory_order_relaxed); }
59 RelaxedCounter& operator+=(T arg)
noexcept {
60 val_.fetch_add(arg, std::memory_order_relaxed);
64 RelaxedCounter& operator-=(T arg)
noexcept {
65 val_.fetch_sub(arg, std::memory_order_relaxed);
70 static_assert(std::atomic<T>::is_always_lock_free);
72 std::atomic<T> val_{T{}};
76void DumpMetric(Writer& writer,
const RelaxedCounter<T>& value) {