8#include <userver/utils/statistics/rate.hpp>
10USERVER_NAMESPACE_BEGIN
12namespace utils::statistics {
20class RateCounter
final {
22 using ValueType =
Rate;
24 constexpr RateCounter()
noexcept =
default;
26 constexpr explicit RateCounter(
Rate desired)
noexcept : val_(desired.value) {}
28 constexpr explicit RateCounter(
Rate::ValueType desired)
noexcept : val_(desired) {}
30 RateCounter(
const RateCounter& other)
noexcept : val_(other.Load().value) {}
32 RateCounter& operator=(
const RateCounter& other)
noexcept {
41 RateCounter& operator=(
Rate desired)
noexcept {
46 void Store(
Rate desired, std::memory_order order = std::memory_order_relaxed)
noexcept {
47 val_.store(desired.value, order);
50 Rate Load()
const noexcept {
return Rate{val_.load(std::memory_order_relaxed)}; }
52 void Add(
Rate arg, std::memory_order order = std::memory_order_relaxed)
noexcept {
53 val_.fetch_add(arg.value, order);
56 void AddAsSingleProducer(
Rate arg)
noexcept {
57 val_.store(val_.load(std::memory_order_relaxed) + arg.value, std::memory_order_relaxed);
60 RateCounter& operator++()
noexcept {
61 val_.fetch_add(1, std::memory_order_relaxed);
65 Rate operator++(
int)
noexcept {
return Rate{val_.fetch_add(1, std::memory_order_relaxed)}; }
67 RateCounter& operator+=(
Rate arg)
noexcept {
68 val_.fetch_add(arg.value, std::memory_order_relaxed);
72 RateCounter& operator+=(
const RateCounter& arg)
noexcept {
78 static_assert(std::atomic<
Rate::ValueType>::is_always_lock_free);
80 std::atomic<
Rate::ValueType> val_{0};
83void DumpMetric(Writer& writer,
const RateCounter& value);
85void ResetMetric(RateCounter& value);