60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  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 |