Blame view

3rdparty/boost_1_81_0/boost/chrono/round.hpp 1.39 KB
598bfd3f   Hu Chunming   提交_GLIBCXX_USE_CX...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  //  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