annotate DEPENDENCIES/generic/include/boost/chrono/time_point.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
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