1 | // boost/chrono/round.hpp ------------------------------------------------------------// |
2 | |
3 | // (C) Copyright Howard Hinnant |
4 | // Copyright 2011 Vicente J. Botet Escriba |
5 | |
6 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
7 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
8 | |
9 | // See http://www.boost.org/libs/chrono for documentation. |
10 | |
11 | #ifndef BOOST_CHRONO_ROUND_HPP |
12 | #define BOOST_CHRONO_ROUND_HPP |
13 | |
14 | #include <boost/chrono/duration.hpp> |
15 | #include <boost/chrono/duration.hpp> |
16 | //#include <boost/chrono/typeof/boost/chrono/chrono.hpp> |
17 | |
18 | namespace boost |
19 | { |
20 | namespace chrono |
21 | { |
22 | |
23 | /** |
24 | * rounds to nearest, to even on tie |
25 | */ |
26 | template <class To, class Rep, class Period> |
27 | To round(const duration<Rep, Period>& d) |
28 | { |
29 | typedef typename common_type<To, duration<Rep, Period> >::type result_type; |
30 | result_type diff0; |
31 | result_type diff1; |
32 | |
33 | To t0 = duration_cast<To>(d); |
34 | To t1 = t0; |
35 | if (t0>d) { |
36 | --t1; |
37 | diff0 = t0 - d; |
38 | diff1 = d - t1; |
39 | } else { |
40 | ++t1; |
41 | diff0 = d - t0; |
42 | diff1 = t1 - d; |
43 | } |
44 | |
45 | if (diff0 == diff1) |
46 | { |
47 | if (t0.count() & 1) |
48 | return t1; |
49 | return t0; |
50 | } |
51 | else if (diff0 < diff1) |
52 | return t0; |
53 | return t1; |
54 | } |
55 | |
56 | } // namespace chrono |
57 | } // namespace boost |
58 | |
59 | #endif |
60 | |