22class RateCounter
final {
24 using ValueType =
Rate;
26 constexpr RateCounter()
noexcept =
default;
28 constexpr explicit RateCounter(
Rate desired)
noexcept : val_(desired.value) {}
30 constexpr explicit RateCounter(
Rate::ValueType desired)
noexcept : val_(desired) {}
32 RateCounter(
const RateCounter& other)
noexcept : val_(other.Load().value) {}
34 RateCounter& operator=(
const RateCounter& other)
noexcept {
43 RateCounter& operator=(
Rate desired)
noexcept {
48 void Store(
Rate desired, std::memory_order order = std::memory_order_relaxed)
noexcept {
49 val_.store(desired.value, order);
52 Rate Load()
const noexcept {
return Rate{val_.load(std::memory_order_relaxed)}; }
54 void Add(
Rate arg, std::memory_order order = std::memory_order_relaxed)
noexcept {
55 val_.fetch_add(arg.value, order);
58 void AddAsSingleProducer(
Rate arg)
noexcept {
59 val_.store(val_.load(std::memory_order_relaxed) + arg.value, std::memory_order_relaxed);
62 Rate operator++()
noexcept {
return Rate{val_.fetch_add(1, std::memory_order_relaxed) + 1}; }
64 Rate operator++(
int)
noexcept {
return Rate{val_.fetch_add(1, std::memory_order_relaxed)}; }
67 return Rate{val_.fetch_add(arg.value, std::memory_order_relaxed) + arg.value};
70 Rate operator+=(
const RateCounter& arg)
noexcept {
return *
this += arg.Load(); }
73 static_assert(std::atomic<
Rate::ValueType>::is_always_lock_free);
75 std::atomic<
Rate::ValueType> val_{0};