annotate DEPENDENCIES/generic/include/boost/asio/detail/chrono_time_traits.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 c530137014c0
children
rev   line source
Chris@16 1 //
Chris@16 2 // detail/chrono_time_traits.hpp
Chris@16 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Chris@16 4 //
Chris@101 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 //
Chris@16 10
Chris@16 11 #ifndef BOOST_ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP
Chris@16 12 #define BOOST_ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP
Chris@16 13
Chris@16 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 15 # pragma once
Chris@16 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 17
Chris@16 18 #include <boost/asio/detail/cstdint.hpp>
Chris@16 19
Chris@16 20 #include <boost/asio/detail/push_options.hpp>
Chris@16 21
Chris@16 22 namespace boost {
Chris@16 23 namespace asio {
Chris@16 24 namespace detail {
Chris@16 25
Chris@101 26 // Helper template to compute the greatest common divisor.
Chris@101 27 template <int64_t v1, int64_t v2>
Chris@101 28 struct gcd { enum { value = gcd<v2, v1 % v2>::value }; };
Chris@101 29
Chris@101 30 template <int64_t v1>
Chris@101 31 struct gcd<v1, 0> { enum { value = v1 }; };
Chris@101 32
Chris@16 33 // Adapts std::chrono clocks for use with a deadline timer.
Chris@16 34 template <typename Clock, typename WaitTraits>
Chris@16 35 struct chrono_time_traits
Chris@16 36 {
Chris@16 37 // The clock type.
Chris@16 38 typedef Clock clock_type;
Chris@16 39
Chris@16 40 // The duration type of the clock.
Chris@16 41 typedef typename clock_type::duration duration_type;
Chris@16 42
Chris@16 43 // The time point type of the clock.
Chris@16 44 typedef typename clock_type::time_point time_type;
Chris@16 45
Chris@16 46 // The period of the clock.
Chris@16 47 typedef typename duration_type::period period_type;
Chris@16 48
Chris@16 49 // Get the current time.
Chris@16 50 static time_type now()
Chris@16 51 {
Chris@16 52 return clock_type::now();
Chris@16 53 }
Chris@16 54
Chris@16 55 // Add a duration to a time.
Chris@16 56 static time_type add(const time_type& t, const duration_type& d)
Chris@16 57 {
Chris@16 58 const time_type epoch;
Chris@16 59 if (t >= epoch)
Chris@16 60 {
Chris@16 61 if ((time_type::max)() - t < d)
Chris@16 62 return (time_type::max)();
Chris@16 63 }
Chris@16 64 else // t < epoch
Chris@16 65 {
Chris@16 66 if (-(t - (time_type::min)()) > d)
Chris@16 67 return (time_type::min)();
Chris@16 68 }
Chris@16 69
Chris@16 70 return t + d;
Chris@16 71 }
Chris@16 72
Chris@16 73 // Subtract one time from another.
Chris@16 74 static duration_type subtract(const time_type& t1, const time_type& t2)
Chris@16 75 {
Chris@16 76 const time_type epoch;
Chris@16 77 if (t1 >= epoch)
Chris@16 78 {
Chris@16 79 if (t2 >= epoch)
Chris@16 80 {
Chris@16 81 return t1 - t2;
Chris@16 82 }
Chris@16 83 else if (t2 == (time_type::min)())
Chris@16 84 {
Chris@16 85 return (duration_type::max)();
Chris@16 86 }
Chris@16 87 else if ((time_type::max)() - t1 < epoch - t2)
Chris@16 88 {
Chris@16 89 return (duration_type::max)();
Chris@16 90 }
Chris@16 91 else
Chris@16 92 {
Chris@16 93 return t1 - t2;
Chris@16 94 }
Chris@16 95 }
Chris@16 96 else // t1 < epoch
Chris@16 97 {
Chris@16 98 if (t2 < epoch)
Chris@16 99 {
Chris@16 100 return t1 - t2;
Chris@16 101 }
Chris@16 102 else if (t1 == (time_type::min)())
Chris@16 103 {
Chris@16 104 return (duration_type::min)();
Chris@16 105 }
Chris@16 106 else if ((time_type::max)() - t2 < epoch - t1)
Chris@16 107 {
Chris@16 108 return (duration_type::min)();
Chris@16 109 }
Chris@16 110 else
Chris@16 111 {
Chris@16 112 return -(t2 - t1);
Chris@16 113 }
Chris@16 114 }
Chris@16 115 }
Chris@16 116
Chris@16 117 // Test whether one time is less than another.
Chris@16 118 static bool less_than(const time_type& t1, const time_type& t2)
Chris@16 119 {
Chris@16 120 return t1 < t2;
Chris@16 121 }
Chris@16 122
Chris@16 123 // Implement just enough of the posix_time::time_duration interface to supply
Chris@16 124 // what the timer_queue requires.
Chris@16 125 class posix_time_duration
Chris@16 126 {
Chris@16 127 public:
Chris@16 128 explicit posix_time_duration(const duration_type& d)
Chris@16 129 : d_(d)
Chris@16 130 {
Chris@16 131 }
Chris@16 132
Chris@16 133 int64_t ticks() const
Chris@16 134 {
Chris@16 135 return d_.count();
Chris@16 136 }
Chris@16 137
Chris@16 138 int64_t total_seconds() const
Chris@16 139 {
Chris@16 140 return duration_cast<1, 1>();
Chris@16 141 }
Chris@16 142
Chris@16 143 int64_t total_milliseconds() const
Chris@16 144 {
Chris@16 145 return duration_cast<1, 1000>();
Chris@16 146 }
Chris@16 147
Chris@16 148 int64_t total_microseconds() const
Chris@16 149 {
Chris@16 150 return duration_cast<1, 1000000>();
Chris@16 151 }
Chris@16 152
Chris@16 153 private:
Chris@16 154 template <int64_t Num, int64_t Den>
Chris@16 155 int64_t duration_cast() const
Chris@16 156 {
Chris@101 157 const int64_t num1 = period_type::num / gcd<period_type::num, Num>::value;
Chris@101 158 const int64_t num2 = Num / gcd<period_type::num, Num>::value;
Chris@101 159
Chris@101 160 const int64_t den1 = period_type::den / gcd<period_type::den, Den>::value;
Chris@101 161 const int64_t den2 = Den / gcd<period_type::den, Den>::value;
Chris@101 162
Chris@101 163 const int64_t num = num1 * den2;
Chris@101 164 const int64_t den = num2 * den1;
Chris@16 165
Chris@16 166 if (num == 1 && den == 1)
Chris@16 167 return ticks();
Chris@16 168 else if (num != 1 && den == 1)
Chris@16 169 return ticks() * num;
Chris@16 170 else if (num == 1 && period_type::den != 1)
Chris@16 171 return ticks() / den;
Chris@16 172 else
Chris@16 173 return ticks() * num / den;
Chris@16 174 }
Chris@16 175
Chris@16 176 duration_type d_;
Chris@16 177 };
Chris@16 178
Chris@16 179 // Convert to POSIX duration type.
Chris@16 180 static posix_time_duration to_posix_duration(const duration_type& d)
Chris@16 181 {
Chris@16 182 return posix_time_duration(WaitTraits::to_wait_duration(d));
Chris@16 183 }
Chris@16 184 };
Chris@16 185
Chris@16 186 } // namespace detail
Chris@16 187 } // namespace asio
Chris@16 188 } // namespace boost
Chris@16 189
Chris@16 190 #include <boost/asio/detail/pop_options.hpp>
Chris@16 191
Chris@16 192 #endif // BOOST_ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP