userver: userver/utils/statistics/recentperiod_detail.hpp Source File
Loading...
Searching...
No Matches
recentperiod_detail.hpp
1#pragma once
2
3#include <userver/utils/void_t.hpp>
4
5USERVER_NAMESPACE_BEGIN
6
7namespace utils::statistics::detail {
8
9// Detect if the result type provides Add(Counter, Duration, Duration) function
10template <typename Result, typename Counter, typename Duration, typename = void_t<>>
11struct ResultWantsAddFunction : std::false_type {};
12
13template <typename Result, typename Counter, typename Duration>
14struct ResultWantsAddFunction<
15 Result,
16 Counter,
17 Duration,
18 void_t<
19 decltype(std::declval<Result>().Add(std::declval<Counter>(), std::declval<Duration>(), std::declval<Duration>())
20 )>> : std::true_type {};
21
22template <typename Result, typename Counter, typename Duration>
23inline constexpr bool kResultWantsAddFunction = ResultWantsAddFunction<Result, Counter, Duration>::value;
24
25// Detect if a counter can be added to the result
26template <typename Result, typename Counter, typename = void_t<>>
27struct ResultCanUseAddAssign : std::false_type {};
28
29template <typename Result, typename Counter>
30struct
31 ResultCanUseAddAssign<Result, Counter, void_t<decltype(std::declval<Result&>() += std::declval<const Counter&>())>>
32 : std::true_type {};
33
34template <typename Result, typename Counter>
35inline constexpr bool kResultCanUseAddAssign = ResultCanUseAddAssign<Result, Counter>::value;
36
37// Detect if a Counter provides a Reset function
38template <typename Counter, typename = void_t<>>
39struct CanReset : std::false_type {};
40
41template <typename Counter>
42struct CanReset<Counter, void_t<decltype(std::declval<Counter&>().Reset())>> : std::true_type {};
43
44template <typename Counter>
45inline constexpr bool kCanReset = CanReset<Counter>::value;
46
47} // namespace utils::statistics::detail
48
49USERVER_NAMESPACE_END