Chris@16
|
1 // duration.hpp --------------------------------------------------------------//
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright 2008 Howard Hinnant
|
Chris@16
|
4 // Copyright 2008 Beman Dawes
|
Chris@16
|
5 // Copyright 2009-2012 Vicente J. Botet Escriba
|
Chris@16
|
6
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
8 // See http://www.boost.org/LICENSE_1_0.txt
|
Chris@16
|
9
|
Chris@16
|
10 /*
|
Chris@16
|
11
|
Chris@16
|
12 This code was derived by Beman Dawes from Howard Hinnant's time2_demo prototype.
|
Chris@16
|
13 Many thanks to Howard for making his code available under the Boost license.
|
Chris@16
|
14 The original code was modified to conform to Boost conventions and to section
|
Chris@16
|
15 20.9 Time utilities [time] of the C++ committee's working paper N2798.
|
Chris@16
|
16 See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf.
|
Chris@16
|
17
|
Chris@16
|
18 time2_demo contained this comment:
|
Chris@16
|
19
|
Chris@16
|
20 Much thanks to Andrei Alexandrescu,
|
Chris@16
|
21 Walter Brown,
|
Chris@16
|
22 Peter Dimov,
|
Chris@16
|
23 Jeff Garland,
|
Chris@16
|
24 Terry Golubiewski,
|
Chris@16
|
25 Daniel Krugler,
|
Chris@16
|
26 Anthony Williams.
|
Chris@16
|
27 */
|
Chris@16
|
28
|
Chris@16
|
29
|
Chris@16
|
30 #ifndef BOOST_CHRONO_TIME_POINT_HPP
|
Chris@16
|
31 #define BOOST_CHRONO_TIME_POINT_HPP
|
Chris@16
|
32
|
Chris@16
|
33 #include <boost/chrono/duration.hpp>
|
Chris@16
|
34 #include <iostream>
|
Chris@16
|
35
|
Chris@16
|
36 #ifndef BOOST_CHRONO_HEADER_ONLY
|
Chris@16
|
37 // this must occur after all of the includes and before any code appears:
|
Chris@16
|
38 #include <boost/config/abi_prefix.hpp> // must be the last #include
|
Chris@16
|
39 #endif
|
Chris@16
|
40
|
Chris@16
|
41 //----------------------------------------------------------------------------//
|
Chris@16
|
42 // //
|
Chris@16
|
43 // 20.9 Time utilities [time] //
|
Chris@16
|
44 // synopsis //
|
Chris@16
|
45 // //
|
Chris@16
|
46 //----------------------------------------------------------------------------//
|
Chris@16
|
47
|
Chris@16
|
48 namespace boost {
|
Chris@16
|
49 namespace chrono {
|
Chris@16
|
50
|
Chris@16
|
51 template <class Clock, class Duration = typename Clock::duration>
|
Chris@16
|
52 class time_point;
|
Chris@16
|
53
|
Chris@16
|
54
|
Chris@16
|
55 } // namespace chrono
|
Chris@16
|
56
|
Chris@16
|
57
|
Chris@16
|
58 // common_type trait specializations
|
Chris@16
|
59
|
Chris@16
|
60 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
61 struct common_type<chrono::time_point<Clock, Duration1>,
|
Chris@16
|
62 chrono::time_point<Clock, Duration2> >;
|
Chris@16
|
63
|
Chris@16
|
64
|
Chris@16
|
65 //----------------------------------------------------------------------------//
|
Chris@16
|
66 // 20.9.2.3 Specializations of common_type [time.traits.specializations] //
|
Chris@16
|
67 //----------------------------------------------------------------------------//
|
Chris@16
|
68
|
Chris@16
|
69
|
Chris@16
|
70 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
71 struct common_type<chrono::time_point<Clock, Duration1>,
|
Chris@16
|
72 chrono::time_point<Clock, Duration2> >
|
Chris@16
|
73 {
|
Chris@16
|
74 typedef chrono::time_point<Clock,
|
Chris@16
|
75 typename common_type<Duration1, Duration2>::type> type;
|
Chris@16
|
76 };
|
Chris@16
|
77
|
Chris@16
|
78
|
Chris@16
|
79
|
Chris@16
|
80 namespace chrono {
|
Chris@16
|
81
|
Chris@16
|
82 // time_point arithmetic
|
Chris@16
|
83 template <class Clock, class Duration1, class Rep2, class Period2>
|
Chris@16
|
84 inline BOOST_CONSTEXPR
|
Chris@16
|
85 time_point<Clock,
|
Chris@16
|
86 typename common_type<Duration1, duration<Rep2, Period2> >::type>
|
Chris@16
|
87 operator+(
|
Chris@16
|
88 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
89 const duration<Rep2, Period2>& rhs);
|
Chris@16
|
90 template <class Rep1, class Period1, class Clock, class Duration2>
|
Chris@16
|
91 inline BOOST_CONSTEXPR
|
Chris@16
|
92 time_point<Clock,
|
Chris@16
|
93 typename common_type<duration<Rep1, Period1>, Duration2>::type>
|
Chris@16
|
94 operator+(
|
Chris@16
|
95 const duration<Rep1, Period1>& lhs,
|
Chris@16
|
96 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
97 template <class Clock, class Duration1, class Rep2, class Period2>
|
Chris@16
|
98 inline BOOST_CONSTEXPR
|
Chris@16
|
99 time_point<Clock,
|
Chris@16
|
100 typename common_type<Duration1, duration<Rep2, Period2> >::type>
|
Chris@16
|
101 operator-(
|
Chris@16
|
102 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
103 const duration<Rep2, Period2>& rhs);
|
Chris@16
|
104 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
105 inline BOOST_CONSTEXPR
|
Chris@16
|
106 typename common_type<Duration1, Duration2>::type
|
Chris@16
|
107 operator-(
|
Chris@16
|
108 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
109 const time_point<Clock,
|
Chris@16
|
110 Duration2>& rhs);
|
Chris@16
|
111
|
Chris@16
|
112 // time_point comparisons
|
Chris@16
|
113 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
114 inline BOOST_CONSTEXPR
|
Chris@16
|
115 bool operator==(
|
Chris@16
|
116 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
117 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
118 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
119 inline BOOST_CONSTEXPR
|
Chris@16
|
120 bool operator!=(
|
Chris@16
|
121 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
122 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
123 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
124 inline BOOST_CONSTEXPR
|
Chris@16
|
125 bool operator< (
|
Chris@16
|
126 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
127 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
128 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
129 inline BOOST_CONSTEXPR
|
Chris@16
|
130 bool operator<=(
|
Chris@16
|
131 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
132 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
133 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
134 inline BOOST_CONSTEXPR
|
Chris@16
|
135 bool operator> (
|
Chris@16
|
136 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
137 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
138 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
139 inline BOOST_CONSTEXPR
|
Chris@16
|
140 bool operator>=(
|
Chris@16
|
141 const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
142 const time_point<Clock, Duration2>& rhs);
|
Chris@16
|
143
|
Chris@16
|
144 // time_point_cast
|
Chris@16
|
145 template <class ToDuration, class Clock, class Duration>
|
Chris@16
|
146 inline BOOST_CONSTEXPR
|
Chris@16
|
147 time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
|
Chris@16
|
148
|
Chris@16
|
149 //----------------------------------------------------------------------------//
|
Chris@16
|
150 // //
|
Chris@16
|
151 // 20.9.4 Class template time_point [time.point] //
|
Chris@16
|
152 // //
|
Chris@16
|
153 //----------------------------------------------------------------------------//
|
Chris@16
|
154
|
Chris@16
|
155 template <class Clock, class Duration>
|
Chris@16
|
156 class time_point
|
Chris@16
|
157 {
|
Chris@16
|
158 BOOST_CHRONO_STATIC_ASSERT(boost::chrono::detail::is_duration<Duration>::value,
|
Chris@16
|
159 BOOST_CHRONO_SECOND_TEMPLATE_PARAMETER_OF_TIME_POINT_MUST_BE_A_BOOST_CHRONO_DURATION, (Duration));
|
Chris@16
|
160 public:
|
Chris@16
|
161 typedef Clock clock;
|
Chris@16
|
162 typedef Duration duration;
|
Chris@16
|
163 typedef typename duration::rep rep;
|
Chris@16
|
164 typedef typename duration::period period;
|
Chris@16
|
165 typedef Duration difference_type;
|
Chris@16
|
166
|
Chris@16
|
167 private:
|
Chris@16
|
168 duration d_;
|
Chris@16
|
169
|
Chris@16
|
170 public:
|
Chris@16
|
171 BOOST_FORCEINLINE BOOST_CONSTEXPR
|
Chris@16
|
172 time_point() : d_(duration::zero())
|
Chris@16
|
173 {}
|
Chris@16
|
174 BOOST_FORCEINLINE BOOST_CONSTEXPR
|
Chris@16
|
175 explicit time_point(const duration& d)
|
Chris@16
|
176 : d_(d)
|
Chris@16
|
177 {}
|
Chris@16
|
178
|
Chris@16
|
179 // conversions
|
Chris@16
|
180 template <class Duration2>
|
Chris@16
|
181 BOOST_FORCEINLINE BOOST_CONSTEXPR
|
Chris@16
|
182 time_point(const time_point<clock, Duration2>& t
|
Chris@16
|
183 , typename boost::enable_if
|
Chris@16
|
184 <
|
Chris@16
|
185 boost::is_convertible<Duration2, duration>
|
Chris@16
|
186 >::type* = 0
|
Chris@16
|
187 )
|
Chris@16
|
188 : d_(t.time_since_epoch())
|
Chris@16
|
189 {
|
Chris@16
|
190 }
|
Chris@16
|
191 // observer
|
Chris@16
|
192
|
Chris@16
|
193 BOOST_CONSTEXPR
|
Chris@16
|
194 duration time_since_epoch() const
|
Chris@16
|
195 {
|
Chris@16
|
196 return d_;
|
Chris@16
|
197 }
|
Chris@16
|
198
|
Chris@16
|
199 // arithmetic
|
Chris@16
|
200
|
Chris@16
|
201 #ifdef BOOST_CHRONO_EXTENSIONS
|
Chris@16
|
202 BOOST_CONSTEXPR
|
Chris@16
|
203 time_point operator+() const {return *this;}
|
Chris@16
|
204 BOOST_CONSTEXPR
|
Chris@16
|
205 time_point operator-() const {return time_point(-d_);}
|
Chris@16
|
206 time_point& operator++() {++d_; return *this;}
|
Chris@16
|
207 time_point operator++(int) {return time_point(d_++);}
|
Chris@16
|
208 time_point& operator--() {--d_; return *this;}
|
Chris@16
|
209 time_point operator--(int) {return time_point(d_--);}
|
Chris@16
|
210
|
Chris@16
|
211 time_point& operator+=(const rep& r) {d_ += duration(r); return *this;}
|
Chris@16
|
212 time_point& operator-=(const rep& r) {d_ -= duration(r); return *this;}
|
Chris@16
|
213
|
Chris@16
|
214 #endif
|
Chris@16
|
215
|
Chris@16
|
216 time_point& operator+=(const duration& d) {d_ += d; return *this;}
|
Chris@16
|
217 time_point& operator-=(const duration& d) {d_ -= d; return *this;}
|
Chris@16
|
218
|
Chris@16
|
219 // special values
|
Chris@16
|
220
|
Chris@16
|
221 static BOOST_CHRONO_LIB_CONSTEXPR time_point
|
Chris@16
|
222 min BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
223 {
|
Chris@16
|
224 return time_point((duration::min)());
|
Chris@16
|
225 }
|
Chris@16
|
226 static BOOST_CHRONO_LIB_CONSTEXPR time_point
|
Chris@16
|
227 max BOOST_PREVENT_MACRO_SUBSTITUTION ()
|
Chris@16
|
228 {
|
Chris@16
|
229 return time_point((duration::max)());
|
Chris@16
|
230 }
|
Chris@16
|
231 };
|
Chris@16
|
232
|
Chris@16
|
233 //----------------------------------------------------------------------------//
|
Chris@16
|
234 // 20.9.4.5 time_point non-member arithmetic [time.point.nonmember] //
|
Chris@16
|
235 //----------------------------------------------------------------------------//
|
Chris@16
|
236
|
Chris@16
|
237 // time_point operator+(time_point x, duration y);
|
Chris@16
|
238
|
Chris@16
|
239 template <class Clock, class Duration1, class Rep2, class Period2>
|
Chris@16
|
240 inline BOOST_CONSTEXPR
|
Chris@16
|
241 time_point<Clock,
|
Chris@16
|
242 typename common_type<Duration1, duration<Rep2, Period2> >::type>
|
Chris@16
|
243 operator+(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
244 const duration<Rep2, Period2>& rhs)
|
Chris@16
|
245 {
|
Chris@16
|
246 typedef typename common_type<Duration1, duration<Rep2, Period2> >::type CDuration;
|
Chris@16
|
247 typedef time_point<
|
Chris@16
|
248 Clock,
|
Chris@16
|
249 CDuration
|
Chris@16
|
250 > TimeResult;
|
Chris@16
|
251 return TimeResult(lhs.time_since_epoch() + CDuration(rhs));
|
Chris@16
|
252 }
|
Chris@16
|
253
|
Chris@16
|
254 // time_point operator+(duration x, time_point y);
|
Chris@16
|
255
|
Chris@16
|
256 template <class Rep1, class Period1, class Clock, class Duration2>
|
Chris@16
|
257 inline BOOST_CONSTEXPR
|
Chris@16
|
258 time_point<Clock,
|
Chris@16
|
259 typename common_type<duration<Rep1, Period1>, Duration2>::type>
|
Chris@16
|
260 operator+(const duration<Rep1, Period1>& lhs,
|
Chris@16
|
261 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
262 {
|
Chris@16
|
263 return rhs + lhs;
|
Chris@16
|
264 }
|
Chris@16
|
265
|
Chris@16
|
266 // time_point operator-(time_point x, duration y);
|
Chris@16
|
267
|
Chris@16
|
268 template <class Clock, class Duration1, class Rep2, class Period2>
|
Chris@16
|
269 inline BOOST_CONSTEXPR
|
Chris@16
|
270 time_point<Clock,
|
Chris@16
|
271 typename common_type<Duration1, duration<Rep2, Period2> >::type>
|
Chris@16
|
272 operator-(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
273 const duration<Rep2, Period2>& rhs)
|
Chris@16
|
274 {
|
Chris@16
|
275 return lhs + (-rhs);
|
Chris@16
|
276 }
|
Chris@16
|
277
|
Chris@16
|
278 // duration operator-(time_point x, time_point y);
|
Chris@16
|
279
|
Chris@16
|
280 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
281 inline BOOST_CONSTEXPR
|
Chris@16
|
282 typename common_type<Duration1, Duration2>::type
|
Chris@16
|
283 operator-(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
284 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
285 {
|
Chris@16
|
286 return lhs.time_since_epoch() - rhs.time_since_epoch();
|
Chris@16
|
287 }
|
Chris@16
|
288
|
Chris@16
|
289 //----------------------------------------------------------------------------//
|
Chris@16
|
290 // 20.9.4.6 time_point comparisons [time.point.comparisons] //
|
Chris@16
|
291 //----------------------------------------------------------------------------//
|
Chris@16
|
292
|
Chris@16
|
293 // time_point ==
|
Chris@16
|
294
|
Chris@16
|
295 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
296 inline BOOST_CONSTEXPR
|
Chris@16
|
297 bool
|
Chris@16
|
298 operator==(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
299 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
300 {
|
Chris@16
|
301 return lhs.time_since_epoch() == rhs.time_since_epoch();
|
Chris@16
|
302 }
|
Chris@16
|
303
|
Chris@16
|
304 // time_point !=
|
Chris@16
|
305
|
Chris@16
|
306 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
307 inline BOOST_CONSTEXPR
|
Chris@16
|
308 bool
|
Chris@16
|
309 operator!=(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
310 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
311 {
|
Chris@16
|
312 return !(lhs == rhs);
|
Chris@16
|
313 }
|
Chris@16
|
314
|
Chris@16
|
315 // time_point <
|
Chris@16
|
316
|
Chris@16
|
317 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
318 inline BOOST_CONSTEXPR
|
Chris@16
|
319 bool
|
Chris@16
|
320 operator<(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
321 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
322 {
|
Chris@16
|
323 return lhs.time_since_epoch() < rhs.time_since_epoch();
|
Chris@16
|
324 }
|
Chris@16
|
325
|
Chris@16
|
326 // time_point >
|
Chris@16
|
327
|
Chris@16
|
328 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
329 inline BOOST_CONSTEXPR
|
Chris@16
|
330 bool
|
Chris@16
|
331 operator>(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
332 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
333 {
|
Chris@16
|
334 return rhs < lhs;
|
Chris@16
|
335 }
|
Chris@16
|
336
|
Chris@16
|
337 // time_point <=
|
Chris@16
|
338
|
Chris@16
|
339 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
340 inline BOOST_CONSTEXPR
|
Chris@16
|
341 bool
|
Chris@16
|
342 operator<=(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
343 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
344 {
|
Chris@16
|
345 return !(rhs < lhs);
|
Chris@16
|
346 }
|
Chris@16
|
347
|
Chris@16
|
348 // time_point >=
|
Chris@16
|
349
|
Chris@16
|
350 template <class Clock, class Duration1, class Duration2>
|
Chris@16
|
351 inline BOOST_CONSTEXPR
|
Chris@16
|
352 bool
|
Chris@16
|
353 operator>=(const time_point<Clock, Duration1>& lhs,
|
Chris@16
|
354 const time_point<Clock, Duration2>& rhs)
|
Chris@16
|
355 {
|
Chris@16
|
356 return !(lhs < rhs);
|
Chris@16
|
357 }
|
Chris@16
|
358
|
Chris@16
|
359 //----------------------------------------------------------------------------//
|
Chris@16
|
360 // 20.9.4.7 time_point_cast [time.point.cast] //
|
Chris@16
|
361 //----------------------------------------------------------------------------//
|
Chris@16
|
362
|
Chris@16
|
363 template <class ToDuration, class Clock, class Duration>
|
Chris@16
|
364 inline BOOST_CONSTEXPR
|
Chris@16
|
365 time_point<Clock, ToDuration>
|
Chris@16
|
366 time_point_cast(const time_point<Clock, Duration>& t)
|
Chris@16
|
367 {
|
Chris@16
|
368 return time_point<Clock, ToDuration>(
|
Chris@16
|
369 duration_cast<ToDuration>(t.time_since_epoch()));
|
Chris@16
|
370 }
|
Chris@16
|
371
|
Chris@16
|
372 } // namespace chrono
|
Chris@16
|
373 } // namespace boost
|
Chris@16
|
374
|
Chris@16
|
375 #ifndef BOOST_CHRONO_HEADER_ONLY
|
Chris@16
|
376 // the suffix header occurs after all of our code:
|
Chris@16
|
377 #include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
|
Chris@16
|
378 #endif
|
Chris@16
|
379
|
Chris@16
|
380 #endif // BOOST_CHRONO_TIME_POINT_HPP
|