annotate DEPENDENCIES/generic/include/boost/asio/detail/chrono_time_traits.hpp @ 46:d572322e2efe

Fix to .cat file check (was susceptible to DOS line-endings) and subrepo update
author Chris Cannam
date Thu, 07 Aug 2014 14:39:38 +0100
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 //
Chris@16 2 // detail/chrono_time_traits.hpp
Chris@16 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Chris@16 4 //
Chris@16 5 // Copyright (c) 2003-2013 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@16 26 // Adapts std::chrono clocks for use with a deadline timer.
Chris@16 27 template <typename Clock, typename WaitTraits>
Chris@16 28 struct chrono_time_traits
Chris@16 29 {
Chris@16 30 // The clock type.
Chris@16 31 typedef Clock clock_type;
Chris@16 32
Chris@16 33 // The duration type of the clock.
Chris@16 34 typedef typename clock_type::duration duration_type;
Chris@16 35
Chris@16 36 // The time point type of the clock.
Chris@16 37 typedef typename clock_type::time_point time_type;
Chris@16 38
Chris@16 39 // The period of the clock.
Chris@16 40 typedef typename duration_type::period period_type;
Chris@16 41
Chris@16 42 // Get the current time.
Chris@16 43 static time_type now()
Chris@16 44 {
Chris@16 45 return clock_type::now();
Chris@16 46 }
Chris@16 47
Chris@16 48 // Add a duration to a time.
Chris@16 49 static time_type add(const time_type& t, const duration_type& d)
Chris@16 50 {
Chris@16 51 const time_type epoch;
Chris@16 52 if (t >= epoch)
Chris@16 53 {
Chris@16 54 if ((time_type::max)() - t < d)
Chris@16 55 return (time_type::max)();
Chris@16 56 }
Chris@16 57 else // t < epoch
Chris@16 58 {
Chris@16 59 if (-(t - (time_type::min)()) > d)
Chris@16 60 return (time_type::min)();
Chris@16 61 }
Chris@16 62
Chris@16 63 return t + d;
Chris@16 64 }
Chris@16 65
Chris@16 66 // Subtract one time from another.
Chris@16 67 static duration_type subtract(const time_type& t1, const time_type& t2)
Chris@16 68 {
Chris@16 69 const time_type epoch;
Chris@16 70 if (t1 >= epoch)
Chris@16 71 {
Chris@16 72 if (t2 >= epoch)
Chris@16 73 {
Chris@16 74 return t1 - t2;
Chris@16 75 }
Chris@16 76 else if (t2 == (time_type::min)())
Chris@16 77 {
Chris@16 78 return (duration_type::max)();
Chris@16 79 }
Chris@16 80 else if ((time_type::max)() - t1 < epoch - t2)
Chris@16 81 {
Chris@16 82 return (duration_type::max)();
Chris@16 83 }
Chris@16 84 else
Chris@16 85 {
Chris@16 86 return t1 - t2;
Chris@16 87 }
Chris@16 88 }
Chris@16 89 else // t1 < epoch
Chris@16 90 {
Chris@16 91 if (t2 < epoch)
Chris@16 92 {
Chris@16 93 return t1 - t2;
Chris@16 94 }
Chris@16 95 else if (t1 == (time_type::min)())
Chris@16 96 {
Chris@16 97 return (duration_type::min)();
Chris@16 98 }
Chris@16 99 else if ((time_type::max)() - t2 < epoch - t1)
Chris@16 100 {
Chris@16 101 return (duration_type::min)();
Chris@16 102 }
Chris@16 103 else
Chris@16 104 {
Chris@16 105 return -(t2 - t1);
Chris@16 106 }
Chris@16 107 }
Chris@16 108 }
Chris@16 109
Chris@16 110 // Test whether one time is less than another.
Chris@16 111 static bool less_than(const time_type& t1, const time_type& t2)
Chris@16 112 {
Chris@16 113 return t1 < t2;
Chris@16 114 }
Chris@16 115
Chris@16 116 // Implement just enough of the posix_time::time_duration interface to supply
Chris@16 117 // what the timer_queue requires.
Chris@16 118 class posix_time_duration
Chris@16 119 {
Chris@16 120 public:
Chris@16 121 explicit posix_time_duration(const duration_type& d)
Chris@16 122 : d_(d)
Chris@16 123 {
Chris@16 124 }
Chris@16 125
Chris@16 126 int64_t ticks() const
Chris@16 127 {
Chris@16 128 return d_.count();
Chris@16 129 }
Chris@16 130
Chris@16 131 int64_t total_seconds() const
Chris@16 132 {
Chris@16 133 return duration_cast<1, 1>();
Chris@16 134 }
Chris@16 135
Chris@16 136 int64_t total_milliseconds() const
Chris@16 137 {
Chris@16 138 return duration_cast<1, 1000>();
Chris@16 139 }
Chris@16 140
Chris@16 141 int64_t total_microseconds() const
Chris@16 142 {
Chris@16 143 return duration_cast<1, 1000000>();
Chris@16 144 }
Chris@16 145
Chris@16 146 private:
Chris@16 147 template <int64_t Num, int64_t Den>
Chris@16 148 int64_t duration_cast() const
Chris@16 149 {
Chris@16 150 const int64_t num = period_type::num * Den;
Chris@16 151 const int64_t den = period_type::den * Num;
Chris@16 152
Chris@16 153 if (num == 1 && den == 1)
Chris@16 154 return ticks();
Chris@16 155 else if (num != 1 && den == 1)
Chris@16 156 return ticks() * num;
Chris@16 157 else if (num == 1 && period_type::den != 1)
Chris@16 158 return ticks() / den;
Chris@16 159 else
Chris@16 160 return ticks() * num / den;
Chris@16 161 }
Chris@16 162
Chris@16 163 duration_type d_;
Chris@16 164 };
Chris@16 165
Chris@16 166 // Convert to POSIX duration type.
Chris@16 167 static posix_time_duration to_posix_duration(const duration_type& d)
Chris@16 168 {
Chris@16 169 return posix_time_duration(WaitTraits::to_wait_duration(d));
Chris@16 170 }
Chris@16 171 };
Chris@16 172
Chris@16 173 } // namespace detail
Chris@16 174 } // namespace asio
Chris@16 175 } // namespace boost
Chris@16 176
Chris@16 177 #include <boost/asio/detail/pop_options.hpp>
Chris@16 178
Chris@16 179 #endif // BOOST_ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP