1 #ifndef POSIX_TIME_CONFIG_HPP___
2 #define POSIX_TIME_CONFIG_HPP___
3 
4 /* Copyright (c) 2002,2003,2005,2020 CrystalClear Software, Inc.
5  * Use, modification and distribution is subject to the
6  * Boost Software License, Version 1.0. (See accompanying
7  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8  * Author: Jeff Garland, Bart Garst
9  * $Date$
10  */
11 
12 #include <cstdlib> //for MCW 7.2 std::abs(long long)
13 #include <boost/limits.hpp>
14 #include <boost/cstdint.hpp>
15 #include <boost/config/no_tr1/cmath.hpp>
16 #include <boost/date_time/time_duration.hpp>
17 #include <boost/date_time/time_resolution_traits.hpp>
18 #include <boost/date_time/gregorian/gregorian_types.hpp>
19 #include <boost/date_time/wrapping_int.hpp>
20 #include <boost/date_time/compiler_config.hpp>
21 
22 namespace boost {
23 namespace posix_time {
24 
25 
26 #ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
27   // set up conditional test compilations
28 #define BOOST_DATE_TIME_HAS_NANOSECONDS
29   typedef date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::nano,
30     1000000000, 9 > time_res_traits;
31 #else
32   // set up conditional test compilations
33 #undef  BOOST_DATE_TIME_HAS_NANOSECONDS
34   typedef date_time::time_resolution_traits<
35     boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro,
36                                             1000000, 6 > time_res_traits;
37 
38 #endif
39 
40 
41   //! Base time duration type
42   /*! \ingroup time_basics
43    */
44   class BOOST_SYMBOL_VISIBLE time_duration :
45     public date_time::time_duration<time_duration, time_res_traits>
46   {
47   public:
48     typedef time_res_traits rep_type;
49     typedef time_res_traits::day_type day_type;
50     typedef time_res_traits::hour_type hour_type;
51     typedef time_res_traits::min_type min_type;
52     typedef time_res_traits::sec_type sec_type;
53     typedef time_res_traits::fractional_seconds_type fractional_seconds_type;
54     typedef time_res_traits::tick_type tick_type;
55     typedef time_res_traits::impl_type impl_type;
time_duration(hour_type hour,min_type min,sec_type sec,fractional_seconds_type fs=0)56     BOOST_CXX14_CONSTEXPR time_duration(hour_type hour,
57                                         min_type min,
58                                         sec_type sec,
59                                         fractional_seconds_type fs=0) :
60       date_time::time_duration<time_duration, time_res_traits>(hour,min,sec,fs)
61     {}
time_duration()62    BOOST_CXX14_CONSTEXPR time_duration() :
63       date_time::time_duration<time_duration, time_res_traits>(0,0,0)
64     {}
65     //! Construct from special_values
time_duration(boost::date_time::special_values sv)66     BOOST_CXX14_CONSTEXPR time_duration(boost::date_time::special_values sv) :
67       date_time::time_duration<time_duration, time_res_traits>(sv)
68     {}
69     //Give duration access to ticks constructor -- hide from users
70     friend class date_time::time_duration<time_duration, time_res_traits>;
71   protected:
time_duration(impl_type tick_count)72     BOOST_CXX14_CONSTEXPR explicit time_duration(impl_type tick_count) :
73       date_time::time_duration<time_duration, time_res_traits>(tick_count)
74     {}
75   };
76 
77 #ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
78 
79   //! Simple implementation for the time rep
80   struct simple_time_rep
81   {
82     typedef gregorian::date      date_type;
83     typedef time_duration        time_duration_type;
simple_time_repboost::posix_time::simple_time_rep84     BOOST_CXX14_CONSTEXPR simple_time_rep(date_type d, time_duration_type tod) :
85       day(d),
86       time_of_day(tod)
87     {
88       // make sure we have sane values for date & time
89       if(!day.is_special() && !time_of_day.is_special()){
90         if(time_of_day >= time_duration_type(24,0,0)) {
91           while(time_of_day >= time_duration_type(24,0,0)) {
92             day += date_type::duration_type(1);
93             time_of_day -= time_duration_type(24,0,0);
94           }
95         }
96         else if(time_of_day.is_negative()) {
97           while(time_of_day.is_negative()) {
98             day -= date_type::duration_type(1);
99             time_of_day += time_duration_type(24,0,0);
100           }
101         }
102       }
103     }
104     date_type day;
105     time_duration_type time_of_day;
is_specialboost::posix_time::simple_time_rep106     BOOST_CXX14_CONSTEXPR bool is_special()const
107     {
108       return(is_pos_infinity() || is_neg_infinity() || is_not_a_date_time());
109     }
is_pos_infinityboost::posix_time::simple_time_rep110     BOOST_CXX14_CONSTEXPR bool is_pos_infinity()const
111     {
112       return(day.is_pos_infinity() || time_of_day.is_pos_infinity());
113     }
is_neg_infinityboost::posix_time::simple_time_rep114     BOOST_CXX14_CONSTEXPR bool is_neg_infinity()const
115     {
116       return(day.is_neg_infinity() || time_of_day.is_neg_infinity());
117     }
is_not_a_date_timeboost::posix_time::simple_time_rep118     BOOST_CXX14_CONSTEXPR bool is_not_a_date_time()const
119     {
120       return(day.is_not_a_date() || time_of_day.is_not_a_date_time());
121     }
122   };
123 
124   class BOOST_SYMBOL_VISIBLE posix_time_system_config
125   {
126    public:
127     typedef simple_time_rep time_rep_type;
128     typedef gregorian::date date_type;
129     typedef gregorian::date_duration date_duration_type;
130     typedef time_duration time_duration_type;
131     typedef time_res_traits::tick_type int_type;
132     typedef time_res_traits resolution_traits;
133 #if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers
134 #else
135     BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000000);
136 #endif
137   };
138 
139 #else
140 
141   class millisec_posix_time_system_config
142   {
143    public:
144     typedef boost::int64_t time_rep_type;
145     //typedef time_res_traits::tick_type time_rep_type;
146     typedef gregorian::date date_type;
147     typedef gregorian::date_duration date_duration_type;
148     typedef time_duration time_duration_type;
149     typedef time_res_traits::tick_type int_type;
150     typedef time_res_traits::impl_type impl_type;
151     typedef time_res_traits resolution_traits;
152 #if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers
153 #else
154     BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000);
155 #endif
156   };
157 
158 #endif
159 
160 } }//namespace posix_time
161 
162 
163 #endif
164 
165 
166