NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
time_point.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_TIME_TIME_POINT_HPP__
2#define NEFORCE_CORE_TIME_TIME_POINT_HPP__
3
10
12NEFORCE_BEGIN_NAMESPACE__
13
14template <typename Clock, typename Dur = typename Clock::duration>
15struct time_point;
16
18NEFORCE_BEGIN_INNER__
19
29template <typename CommonT, typename Clock, typename Dummy = void>
30struct __timepoint_common_type {};
31
32template <typename CommonT, typename Clock>
33struct __timepoint_common_type<CommonT, Clock, void_t<typename CommonT::type>> {
34 using type = time_point<Clock, typename CommonT::type>;
35};
36
37NEFORCE_END_INNER__
39
40template <typename Clock, typename Dur1, typename Dur2>
41struct common_type<time_point<Clock, Dur1>, time_point<Clock, Dur2>>
42: inner::__timepoint_common_type<common_type<Dur1, Dur2>, Clock> {};
43
44template <typename Clock, typename Dur>
45struct common_type<time_point<Clock, Dur>, time_point<Clock, Dur>> {
46 using type = time_point<Clock, Dur>;
47};
48
49template <typename Clock, typename Dur>
50struct common_type<time_point<Clock, Dur>> {
51 using type = time_point<Clock, Dur>;
52};
53
59
70template <typename ToDur, typename Clock, typename Dur, enable_if_t<is_duration_v<ToDur>, int> = 0>
71constexpr time_point<Clock, ToDur> time_cast(const time_point<Clock, Dur>& time_point_value) {
72 return time_point<Clock, ToDur>(_NEFORCE time_cast<ToDur>(time_point_value.since_epoch()));
73}
74
83template <typename Clock, typename Dur>
84struct time_point {
85 static_assert(is_duration_v<Dur>, "duration must be a specialization of duration");
86
87 using clock_type = Clock;
88 using duration_type = Dur;
89 using rep = typename duration_type::rep;
90 using period = typename duration_type::period;
91
92private:
93 duration_type value_;
94
95public:
99 constexpr time_point() :
100 value_(duration_type::zero()) {}
101
106 constexpr explicit time_point(const duration_type& dur) :
107 value_(dur) {}
108
114 template <typename Dur2, typename = enable_if_t<is_convertible_v<Dur2, duration_type>>>
115 constexpr time_point(const time_point<clock_type, Dur2>& value) :
116 value_(value.value_) {}
117
118
123 constexpr time_point& operator++() {
124 ++value_;
125 return *this;
126 }
127
132 constexpr time_point operator++(int) { return time_point{value_++}; }
133
138 constexpr time_point& operator--() {
139 --value_;
140 return *this;
141 }
142
147 constexpr time_point operator--(int) { return time_point{value_--}; }
148
149
155 constexpr time_point& operator+=(const duration_type& dur) {
156 value_ += dur;
157 return *this;
158 }
159
165 constexpr time_point& operator-=(const duration_type& dur) {
166 value_ -= dur;
167 return *this;
168 }
169
174 constexpr duration_type since_epoch() const noexcept { return value_; }
175
180 static constexpr time_point min() noexcept { return time_point(duration_type::min()); }
181
186 static constexpr time_point max() noexcept { return time_point(duration_type::max()); }
187
188 NEFORCE_ALWAYS_INLINE time_point<Clock, nanoseconds> to_nano() const {
189 return _NEFORCE time_cast<nanoseconds>(*this);
190 }
191 NEFORCE_ALWAYS_INLINE time_point<Clock, microseconds> to_micro() const {
192 return _NEFORCE time_cast<microseconds>(*this);
193 }
194 NEFORCE_ALWAYS_INLINE time_point<Clock, milliseconds> to_milli() const {
195 return _NEFORCE time_cast<milliseconds>(*this);
196 }
197 NEFORCE_ALWAYS_INLINE time_point<Clock, seconds> to_sec() const { return _NEFORCE time_cast<seconds>(*this); }
198 NEFORCE_ALWAYS_INLINE time_point<Clock, minutes> to_minu() const { return _NEFORCE time_cast<minutes>(*this); }
199 NEFORCE_ALWAYS_INLINE time_point<Clock, hours> to_hour() const { return _NEFORCE time_cast<hours>(*this); }
200 NEFORCE_ALWAYS_INLINE time_point<Clock, days> to_day() const { return _NEFORCE time_cast<days>(*this); }
201 NEFORCE_ALWAYS_INLINE time_point<Clock, weeks> to_week() const { return _NEFORCE time_cast<weeks>(*this); }
202 NEFORCE_ALWAYS_INLINE time_point<Clock, years> to_year() const { return _NEFORCE time_cast<years>(*this); }
203 NEFORCE_ALWAYS_INLINE time_point<Clock, months> to_month() const { return _NEFORCE time_cast<months>(*this); }
204};
205
206template <typename Rep, typename Period>
207template <typename Clock, typename Dur, typename Dummy>
209duration(_NEFORCE time_cast<Dur>(tp.since_epoch())) {}
210
221template <typename Clock, typename Dur1, typename Rep2, typename Period2>
224 using duration2 = duration<Rep2, Period2>;
225 using common_duration = common_type_t<Dur1, duration2>;
226 using result_time_point = time_point<Clock, common_duration>;
227 return result_time_point(lhs.since_epoch() + rhs);
228}
229
240template <typename Rep1, typename Period1, typename Clock, typename Dur2>
243 using duration1 = duration<Rep1, Period1>;
244 using common_duration = common_type_t<duration1, Dur2>;
245 using result_time_point = time_point<Clock, common_duration>;
246 return result_time_point(rhs.since_epoch() + lhs);
247}
248
259template <typename Clock, typename Dur1, typename Rep2, typename Period2>
262 using duration2 = duration<Rep2, Period2>;
263 using common_duration = common_type_t<Dur1, duration2>;
264 using result_time_point = time_point<Clock, common_duration>;
265 return result_time_point(lhs.since_epoch() - rhs);
266}
267
277template <typename Clock, typename Dur1, typename Dur2>
279 return lhs.since_epoch() - rhs.since_epoch();
280}
281
291template <typename Clock, typename Dur1, typename Dur2>
292constexpr bool operator==(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
293 return lhs.since_epoch() == rhs.since_epoch();
294}
295
305template <typename Clock, typename Dur1, typename Dur2>
306constexpr bool operator!=(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
307 return !(lhs == rhs);
308}
309
319template <typename Clock, typename Dur1, typename Dur2>
320constexpr bool operator<(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
321 return lhs.since_epoch() < rhs.since_epoch();
322}
323
333template <typename Clock, typename Dur1, typename Dur2>
334constexpr bool operator<=(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
335 return !(rhs < lhs);
336}
337
347template <typename Clock, typename Dur1, typename Dur2>
348constexpr bool operator>(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
349 return rhs < lhs;
350}
351
361template <typename Clock, typename Dur1, typename Dur2>
362constexpr bool operator>=(const time_point<Clock, Dur1>& lhs, const time_point<Clock, Dur2>& rhs) {
363 return !(lhs < rhs);
364}
365 // TimePoint
367
368NEFORCE_END_NAMESPACE__
369#endif // NEFORCE_CORE_TIME_TIME_POINT_HPP__
持续时间类型
NEFORCE_INLINE17 constexpr bool is_duration_v
is_duration的便捷变量模板
constexpr ToDur time_cast(const duration< Rep, Period > &value)
持续时间类型转换
constexpr bool operator>=(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
大于等于比较运算符
constexpr bool operator!=(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
不等于比较运算符
constexpr time_point< Clock, common_type_t< Dur1, duration< Rep2, Period2 > > > operator-(const time_point< Clock, Dur1 > &lhs, const duration< Rep2, Period2 > &rhs)
减法运算符(时间点 - 持续时间)
constexpr time_point< Clock, ToDur > time_cast(const time_point< Clock, Dur > &time_point_value)
时间点类型转换
constexpr bool operator>(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
大于比较运算符
constexpr time_point< Clock, common_type_t< Dur1, duration< Rep2, Period2 > > > operator+(const time_point< Clock, Dur1 > &lhs, const duration< Rep2, Period2 > &rhs)
加法运算符(时间点 + 持续时间)
constexpr bool operator<=(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
小于等于比较运算符
constexpr bool operator<(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
小于比较运算符
constexpr bool operator==(const time_point< Clock, Dur1 > &lhs, const time_point< Clock, Dur2 > &rhs)
等于比较运算符
typename common_type< Types... >::type common_type_t
common_type的便捷别名
void void_t
将任意类型映射为void
查找多个类型的公共类型
持续时间类模板
constexpr duration()=default
默认构造函数
时间点类模板
typename duration_type::period period
时间单位比例
constexpr time_point()
默认构造函数
constexpr time_point & operator++()
前置自增运算符
constexpr time_point(const duration_type &dur)
从持续时间构造
constexpr time_point & operator+=(const duration_type &dur)
加法赋值运算符
constexpr time_point operator++(int)
后置自增运算符
constexpr time_point(const time_point< clock_type, Dur2 > &value)
从其他时间点构造
static constexpr time_point max() noexcept
获取最大时间点
constexpr duration_type since_epoch() const noexcept
获取自纪元以来的时间
constexpr time_point & operator-=(const duration_type &dur)
减法赋值运算符
typename duration_type::rep rep
数值类型
Clock clock_type
时钟类型
constexpr time_point operator--(int)
后置自减运算符
static constexpr time_point min() noexcept
获取最小时间点
constexpr time_point & operator--()
前置自减运算符
Dur duration_type
持续时间类型