]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | #ifndef POSIX_TIME_CONFIG_HPP___ |
2 | #define POSIX_TIME_CONFIG_HPP___ | |
3 | ||
4 | /* Copyright (c) 2002,2003,2005 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 | //Remove the following line if you want 64 bit millisecond resolution time | |
26 | //#define BOOST_GDTL_POSIX_TIME_STD_CONFIG | |
27 | ||
28 | #ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG | |
29 | // set up conditional test compilations | |
30 | #define BOOST_DATE_TIME_HAS_MILLISECONDS | |
31 | #define BOOST_DATE_TIME_HAS_MICROSECONDS | |
32 | #define BOOST_DATE_TIME_HAS_NANOSECONDS | |
33 | typedef date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::nano, | |
34 | 1000000000, 9 > time_res_traits; | |
35 | #else | |
36 | // set up conditional test compilations | |
37 | #define BOOST_DATE_TIME_HAS_MILLISECONDS | |
38 | #define BOOST_DATE_TIME_HAS_MICROSECONDS | |
39 | #undef BOOST_DATE_TIME_HAS_NANOSECONDS | |
40 | typedef date_time::time_resolution_traits< | |
41 | boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, | |
42 | 1000000, 6 > time_res_traits; | |
43 | ||
44 | ||
45 | // #undef BOOST_DATE_TIME_HAS_MILLISECONDS | |
46 | // #undef BOOST_DATE_TIME_HAS_MICROSECONDS | |
47 | // #undef BOOST_DATE_TIME_HAS_NANOSECONDS | |
48 | // typedef date_time::time_resolution_traits<boost::int64_t, boost::date_time::tenth, | |
49 | // 10, 0 > time_res_traits; | |
50 | ||
51 | #endif | |
52 | ||
53 | ||
54 | //! Base time duration type | |
55 | /*! \ingroup time_basics | |
56 | */ | |
57 | class time_duration : | |
58 | public date_time::time_duration<time_duration, time_res_traits> | |
59 | { | |
60 | public: | |
61 | typedef time_res_traits rep_type; | |
62 | typedef time_res_traits::day_type day_type; | |
63 | typedef time_res_traits::hour_type hour_type; | |
64 | typedef time_res_traits::min_type min_type; | |
65 | typedef time_res_traits::sec_type sec_type; | |
66 | typedef time_res_traits::fractional_seconds_type fractional_seconds_type; | |
67 | typedef time_res_traits::tick_type tick_type; | |
68 | typedef time_res_traits::impl_type impl_type; | |
69 | time_duration(hour_type hour, | |
70 | min_type min, | |
71 | sec_type sec, | |
72 | fractional_seconds_type fs=0) : | |
73 | date_time::time_duration<time_duration, time_res_traits>(hour,min,sec,fs) | |
74 | {} | |
75 | time_duration() : | |
76 | date_time::time_duration<time_duration, time_res_traits>(0,0,0) | |
77 | {} | |
78 | //! Construct from special_values | |
79 | time_duration(boost::date_time::special_values sv) : | |
80 | date_time::time_duration<time_duration, time_res_traits>(sv) | |
81 | {} | |
82 | //Give duration access to ticks constructor -- hide from users | |
83 | friend class date_time::time_duration<time_duration, time_res_traits>; | |
84 | protected: | |
85 | explicit time_duration(impl_type tick_count) : | |
86 | date_time::time_duration<time_duration, time_res_traits>(tick_count) | |
87 | {} | |
88 | }; | |
89 | ||
90 | #ifdef BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG | |
91 | ||
92 | //! Simple implementation for the time rep | |
93 | struct simple_time_rep | |
94 | { | |
95 | typedef gregorian::date date_type; | |
96 | typedef time_duration time_duration_type; | |
97 | simple_time_rep(date_type d, time_duration_type tod) : | |
98 | day(d), | |
99 | time_of_day(tod) | |
100 | { | |
101 | // make sure we have sane values for date & time | |
102 | if(!day.is_special() && !time_of_day.is_special()){ | |
103 | if(time_of_day >= time_duration_type(24,0,0)) { | |
104 | while(time_of_day >= time_duration_type(24,0,0)) { | |
105 | day += date_type::duration_type(1); | |
106 | time_of_day -= time_duration_type(24,0,0); | |
107 | } | |
108 | } | |
109 | else if(time_of_day.is_negative()) { | |
110 | while(time_of_day.is_negative()) { | |
111 | day -= date_type::duration_type(1); | |
112 | time_of_day += time_duration_type(24,0,0); | |
113 | } | |
114 | } | |
115 | } | |
116 | } | |
117 | date_type day; | |
118 | time_duration_type time_of_day; | |
119 | bool is_special()const | |
120 | { | |
121 | return(is_pos_infinity() || is_neg_infinity() || is_not_a_date_time()); | |
122 | } | |
123 | bool is_pos_infinity()const | |
124 | { | |
125 | return(day.is_pos_infinity() || time_of_day.is_pos_infinity()); | |
126 | } | |
127 | bool is_neg_infinity()const | |
128 | { | |
129 | return(day.is_neg_infinity() || time_of_day.is_neg_infinity()); | |
130 | } | |
131 | bool is_not_a_date_time()const | |
132 | { | |
133 | return(day.is_not_a_date() || time_of_day.is_not_a_date_time()); | |
134 | } | |
135 | }; | |
136 | ||
137 | class posix_time_system_config | |
138 | { | |
139 | public: | |
140 | typedef simple_time_rep time_rep_type; | |
141 | typedef gregorian::date date_type; | |
142 | typedef gregorian::date_duration date_duration_type; | |
143 | typedef time_duration time_duration_type; | |
144 | typedef time_res_traits::tick_type int_type; | |
145 | typedef time_res_traits resolution_traits; | |
146 | #if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers | |
147 | #else | |
148 | BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000000); | |
149 | #endif | |
150 | }; | |
151 | ||
152 | #else | |
153 | ||
154 | class millisec_posix_time_system_config | |
155 | { | |
156 | public: | |
157 | typedef boost::int64_t time_rep_type; | |
158 | //typedef time_res_traits::tick_type time_rep_type; | |
159 | typedef gregorian::date date_type; | |
160 | typedef gregorian::date_duration date_duration_type; | |
161 | typedef time_duration time_duration_type; | |
162 | typedef time_res_traits::tick_type int_type; | |
163 | typedef time_res_traits::impl_type impl_type; | |
164 | typedef time_res_traits resolution_traits; | |
165 | #if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers | |
166 | #else | |
167 | BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000); | |
168 | #endif | |
169 | }; | |
170 | ||
171 | #endif | |
172 | ||
173 | } }//namespace posix_time | |
174 | ||
175 | ||
176 | #endif | |
177 | ||
178 |