Iros
 
Loading...
Searching...
No Matches
duration.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/common.h"
7#include "di/meta/compare.h"
8
9namespace di::chrono {
10template<typename Rep, math::detail::IsRatio Per>
11class Duration {
12public:
13 using Representation = Rep;
14 using Period = Per::Type;
15
16 constexpr static auto zero() { return Duration(Representation(0)); }
17 constexpr static auto min() { return Duration(math::NumericLimits<Representation>::min); }
18 constexpr static auto max() { return Duration(math::NumericLimits<Representation>::max); }
19
20 Duration() = default;
21 Duration(Duration const&) = default;
22
23 template<typename Val>
25 constexpr explicit Duration(Val const& count) : m_count(count) {}
26
27 template<typename Rep2, typename Period2>
29 constexpr Duration(Duration<Rep2, Period2> const& other) {
30 constexpr auto conversion_factor = math::RatioDivide<Period2, Period>::rational;
31 m_count = Representation(other.count()) * Representation(conversion_factor.numerator());
32 }
33
34 auto operator=(Duration const&) -> Duration& = default;
35
36 constexpr auto count() const -> Representation { return m_count; }
37
38 constexpr auto operator+() const { return meta::CommonType<Duration> { count() }; }
39 constexpr auto operator-() const { return meta::CommonType<Duration> { -count() }; }
40
41 constexpr auto operator++() -> Duration& { return ++m_count, *this; }
42 constexpr auto operator++(int) -> Duration { return Duration(m_count++); }
43
44 constexpr auto operator--() -> Duration& { return --m_count, *this; }
45 constexpr auto operator--(int) -> Duration { return Duration(m_count--); }
46
47 constexpr auto operator+=(Duration const& other) -> Duration& { return m_count += other.count(), *this; }
48 constexpr auto operator-=(Duration const& other) -> Duration& { return m_count -= other.count(), *this; }
49 constexpr auto operator*=(Representation const& other) -> Duration& { return m_count *= other, *this; }
50 constexpr auto operator/=(Representation const& other) -> Duration& { return m_count /= other, *this; }
51 constexpr auto operator%=(Representation const& other) -> Duration& { return m_count %= other, *this; }
52 constexpr auto operator%=(Duration const& other) -> Duration& { return m_count %= other.count(), *this; }
53
54private:
55 Representation m_count;
56};
57
58template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
59constexpr auto operator+(Duration<Rep1, Period1> const& a, Duration<Rep2, Period2> const& b) {
61 return R(R(a).count() + R(b).count());
62}
63
64template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
65constexpr auto operator-(Duration<Rep1, Period1> const& a, Duration<Rep2, Period2> const& b) {
67 return R(R(a).count() - R(b).count());
68}
69
70template<typename Rep, math::detail::IsRatio Period, concepts::CommonWith<Rep> Value>
71constexpr auto operator*(Duration<Rep, Period> const& a, Value const& b) {
73 return R(R(a).count() * b);
74}
75
76template<typename Rep, math::detail::IsRatio Period, concepts::CommonWith<Rep> Value>
77constexpr auto operator*(Value const& a, Duration<Rep, Period> const& b) {
79 return R(a * R(b).count());
80}
81
82template<typename Rep, math::detail::IsRatio Period, concepts::CommonWith<Rep> Value>
83constexpr auto operator/(Duration<Rep, Period> const& a, Value const& b) {
85 return R(R(a).count() / b);
86}
87
88template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
89constexpr auto operator/(Duration<Rep1, Period1> const& a, Duration<Rep2, Period2> const& b) {
92 return R(D(a).count() / D(b).count());
93}
94
95template<typename Rep, math::detail::IsRatio Period, concepts::CommonWith<Rep> Value>
96constexpr auto operator%(Duration<Rep, Period> const& a, Value const& b) {
98 return R(R(a).count() % b);
99}
100
101template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
104 return R(R(a).count() % R(b).count());
105}
106
107template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
108constexpr auto operator==(Duration<Rep1, Period1> const& a, Duration<Rep2, Period2> const& b) -> bool {
110 return D(a).count() == D(b).count();
111}
112
113template<typename Rep1, math::detail::IsRatio Period1, concepts::CommonWith<Rep1> Rep2, math::detail::IsRatio Period2>
117 return D(a).count() <=> D(b).count();
118}
119}
120
121namespace di {
122using chrono::Duration;
123}
Definition duration_forward_declaration.h:7
constexpr auto operator++(int) -> Duration
Definition duration.h:42
constexpr auto operator++() -> Duration &
Definition duration.h:41
constexpr auto operator-=(Duration const &other) -> Duration &
Definition duration.h:48
auto operator=(Duration const &) -> Duration &=default
constexpr auto operator+() const
Definition duration.h:38
constexpr auto operator+=(Duration const &other) -> Duration &
Definition duration.h:47
Per::Type Period
Definition duration.h:14
constexpr auto operator*=(Representation const &other) -> Duration &
Definition duration.h:49
constexpr auto operator/=(Representation const &other) -> Duration &
Definition duration.h:50
Rep Representation
Definition duration.h:13
constexpr auto operator--(int) -> Duration
Definition duration.h:45
static constexpr auto zero()
Definition duration.h:16
Duration(Duration const &)=default
constexpr auto count() const -> Representation
Definition duration.h:36
static constexpr auto max()
Definition duration.h:18
constexpr Duration(Val const &count)
Definition duration.h:25
constexpr auto operator--() -> Duration &
Definition duration.h:44
constexpr auto operator%=(Representation const &other) -> Duration &
Definition duration.h:51
static constexpr auto min()
Definition duration.h:17
constexpr auto operator-() const
Definition duration.h:39
constexpr Duration(Duration< Rep2, Period2 > const &other)
Definition duration.h:29
constexpr auto operator%=(Duration const &other) -> Duration &
Definition duration.h:52
Definition operations.h:99
Definition compare.h:91
Definition duration.h:9
constexpr auto operator-(Duration< Rep1, Period1 > const &a, Duration< Rep2, Period2 > const &b)
Definition duration.h:65
constexpr auto operator%(Duration< Rep, Period > const &a, Value const &b)
Definition duration.h:96
constexpr auto operator==(Duration< Rep1, Period1 > const &a, Duration< Rep2, Period2 > const &b) -> bool
Definition duration.h:108
constexpr auto operator+(Duration< Rep1, Period1 > const &a, Duration< Rep2, Period2 > const &b)
Definition duration.h:59
constexpr auto operator<=>(Duration< Rep1, Period1 > const &a, Duration< Rep2, Period2 > const &b)
Definition duration.h:115
constexpr auto operator/(Duration< Rep, Period > const &a, Value const &b)
Definition duration.h:83
constexpr auto operator*(Duration< Rep, Period > const &a, Value const &b)
Definition duration.h:71
detail::CommonTypeHelper< Types... >::Type CommonType
Definition common.h:62
Definition zstring_parser.h:9
constexpr auto count
Definition count.h:37
Definition numeric_limits.h:7
static constexpr Rational< ratio_intmax_t > rational
Definition ratio.h:36
static constexpr ratio_intmax_t den
Definition ratio.h:34