Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
CounterImpl.hpp
1#pragma once
2
3#include "util/Atomic.hpp"
4
5#include <type_traits>
6
7namespace util::prometheus::impl {
8
9template <typename T>
10concept SomeCounterImpl = requires(T a) {
11 typename std::remove_cvref_t<T>::ValueType;
13 { a.add(typename std::remove_cvref_t<T>::ValueType{1}) } -> std::same_as<void>;
14 { a.set(typename std::remove_cvref_t<T>::ValueType{1}) } -> std::same_as<void>;
15 { a.value() } -> SomeNumberType;
16};
17
18template <SomeNumberType NumberType>
19class CounterImpl {
20public:
21 using ValueType = NumberType;
22
23 CounterImpl() = default;
24
25 CounterImpl(CounterImpl const&) = delete;
26
27 CounterImpl(CounterImpl&& other) = default;
28
29 CounterImpl&
30 operator=(CounterImpl const&) = delete;
31 CounterImpl&
32 operator=(CounterImpl&&) = default;
33
34 void
35 add(ValueType const value)
36 {
37 value_->add(value);
38 }
39
40 void
41 set(ValueType const value)
42 {
43 value_->set(value);
44 }
45
46 ValueType
47 value() const
48 {
49 return value_->value();
50 }
51
52private:
53 AtomicPtr<ValueType> value_ = std::make_unique<Atomic<ValueType>>(0);
54};
55
56} // namespace util::prometheus::impl
Specifies a number type.
Definition Concepts.hpp:15
Definition CounterImpl.hpp:10