| // boost/chrono/round.hpp ------------------------------------------------------------// |
| |
| // (C) Copyright Howard Hinnant |
| // Copyright 2011 Vicente J. Botet Escriba |
| |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| |
| // See http://www.boost.org/libs/chrono for documentation. |
| |
| #ifndef BOOST_CHRONO_ROUND_HPP |
| #define BOOST_CHRONO_ROUND_HPP |
| |
| #include <boost/chrono/duration.hpp> |
| #include <boost/chrono/duration.hpp> |
| //#include <boost/chrono/typeof/boost/chrono/chrono.hpp> |
| |
| namespace boost |
| { |
| namespace chrono |
| { |
| |
| /** |
| * rounds to nearest, to even on tie |
| */ |
| template <class To, class Rep, class Period> |
| To round(const duration<Rep, Period>& d) |
| { |
| typedef typename common_type<To, duration<Rep, Period> >::type result_type; |
| result_type diff0; |
| result_type diff1; |
| |
| To t0 = duration_cast<To>(d); |
| To t1 = t0; |
| if (t0>d) { |
| --t1; |
| diff0 = t0 - d; |
| diff1 = d - t1; |
| } else { |
| ++t1; |
| diff0 = d - t0; |
| diff1 = t1 - d; |
| } |
| |
| if (diff0 == diff1) |
| { |
| if (t0.count() & 1) |
| return t1; |
| return t0; |
| } |
| else if (diff0 < diff1) |
| return t0; |
| return t1; |
| } |
| |
| } // namespace chrono |
| } // namespace boost |
| |
| #endif |