annotate DEPENDENCIES/generic/include/boost/date_time/time_system_counted.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef DATE_TIME_TIME_SYSTEM_COUNTED_HPP
Chris@16 2 #define DATE_TIME_TIME_SYSTEM_COUNTED_HPP
Chris@16 3
Chris@16 4 /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
Chris@16 5 * Use, modification and distribution is subject to the
Chris@16 6 * Boost Software License, Version 1.0. (See accompanying
Chris@16 7 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 * Author: Jeff Garland, Bart Garst
Chris@101 9 * $Date$
Chris@16 10 */
Chris@16 11
Chris@16 12
Chris@16 13
Chris@16 14 #include "boost/date_time/time_defs.hpp"
Chris@16 15 #include <string>
Chris@16 16
Chris@16 17
Chris@16 18 namespace boost {
Chris@16 19 namespace date_time {
Chris@16 20
Chris@16 21 //! Time representation that uses a single integer count
Chris@16 22 template<class config>
Chris@16 23 struct counted_time_rep
Chris@16 24 {
Chris@16 25 typedef typename config::int_type int_type;
Chris@16 26 typedef typename config::date_type date_type;
Chris@16 27 typedef typename config::impl_type impl_type;
Chris@16 28 typedef typename date_type::duration_type date_duration_type;
Chris@16 29 typedef typename date_type::calendar_type calendar_type;
Chris@16 30 typedef typename date_type::ymd_type ymd_type;
Chris@16 31 typedef typename config::time_duration_type time_duration_type;
Chris@16 32 typedef typename config::resolution_traits resolution_traits;
Chris@16 33
Chris@16 34 counted_time_rep(const date_type& d, const time_duration_type& time_of_day)
Chris@16 35 : time_count_(1)
Chris@16 36 {
Chris@16 37 if(d.is_infinity() || d.is_not_a_date() || time_of_day.is_special()) {
Chris@16 38 time_count_ = time_of_day.get_rep() + d.day_count();
Chris@16 39 //std::cout << time_count_ << std::endl;
Chris@16 40 }
Chris@16 41 else {
Chris@16 42 time_count_ = (d.day_number() * frac_sec_per_day()) + time_of_day.ticks();
Chris@16 43 }
Chris@16 44 }
Chris@16 45 explicit counted_time_rep(int_type count) :
Chris@16 46 time_count_(count)
Chris@16 47 {}
Chris@16 48 explicit counted_time_rep(impl_type count) :
Chris@16 49 time_count_(count)
Chris@16 50 {}
Chris@16 51 date_type date() const
Chris@16 52 {
Chris@16 53 if(time_count_.is_special()) {
Chris@16 54 return date_type(time_count_.as_special());
Chris@16 55 }
Chris@16 56 else {
Chris@16 57 typename calendar_type::date_int_type dc = day_count();
Chris@16 58 //std::cout << "time_rep here:" << dc << std::endl;
Chris@16 59 ymd_type ymd = calendar_type::from_day_number(dc);
Chris@16 60 return date_type(ymd);
Chris@16 61 }
Chris@16 62 }
Chris@16 63 //int_type day_count() const
Chris@16 64 unsigned long day_count() const
Chris@16 65 {
Chris@16 66 /* resolution_traits::as_number returns a boost::int64_t &
Chris@16 67 * frac_sec_per_day is also a boost::int64_t so, naturally,
Chris@16 68 * the division operation returns a boost::int64_t.
Chris@16 69 * The static_cast to an unsigned long is ok (results in no data loss)
Chris@16 70 * because frac_sec_per_day is either the number of
Chris@16 71 * microseconds per day, or the number of nanoseconds per day.
Chris@16 72 * Worst case scenario: resolution_traits::as_number returns the
Chris@16 73 * maximum value an int64_t can hold and frac_sec_per_day
Chris@16 74 * is microseconds per day (lowest possible value).
Chris@16 75 * The division operation will then return a value of 106751991 -
Chris@16 76 * easily fitting in an unsigned long.
Chris@16 77 */
Chris@16 78 return static_cast<unsigned long>(resolution_traits::as_number(time_count_) / frac_sec_per_day());
Chris@16 79 }
Chris@16 80 int_type time_count() const
Chris@16 81 {
Chris@16 82 return resolution_traits::as_number(time_count_);
Chris@16 83 }
Chris@16 84 int_type tod() const
Chris@16 85 {
Chris@16 86 return resolution_traits::as_number(time_count_) % frac_sec_per_day();
Chris@16 87 }
Chris@16 88 static int_type frac_sec_per_day()
Chris@16 89 {
Chris@16 90 int_type seconds_per_day = 60*60*24;
Chris@16 91 int_type fractional_sec_per_sec(resolution_traits::res_adjust());
Chris@16 92 return seconds_per_day*fractional_sec_per_sec;
Chris@16 93 }
Chris@16 94 bool is_pos_infinity()const
Chris@16 95 {
Chris@16 96 return impl_type::is_pos_inf(time_count_.as_number());
Chris@16 97 }
Chris@16 98 bool is_neg_infinity()const
Chris@16 99 {
Chris@16 100 return impl_type::is_neg_inf(time_count_.as_number());
Chris@16 101 }
Chris@16 102 bool is_not_a_date_time()const
Chris@16 103 {
Chris@16 104 return impl_type::is_not_a_number(time_count_.as_number());
Chris@16 105 }
Chris@16 106 bool is_special()const
Chris@16 107 {
Chris@16 108 return time_count_.is_special();
Chris@16 109 }
Chris@16 110 impl_type get_rep()const
Chris@16 111 {
Chris@16 112 return time_count_;
Chris@16 113 }
Chris@16 114 private:
Chris@16 115 impl_type time_count_;
Chris@16 116 };
Chris@16 117
Chris@16 118 //! An unadjusted time system implementation.
Chris@16 119 template<class time_rep>
Chris@16 120 class counted_time_system
Chris@16 121 {
Chris@16 122 public:
Chris@16 123 typedef time_rep time_rep_type;
Chris@16 124 typedef typename time_rep_type::impl_type impl_type;
Chris@16 125 typedef typename time_rep_type::time_duration_type time_duration_type;
Chris@16 126 typedef typename time_duration_type::fractional_seconds_type fractional_seconds_type;
Chris@16 127 typedef typename time_rep_type::date_type date_type;
Chris@16 128 typedef typename time_rep_type::date_duration_type date_duration_type;
Chris@16 129
Chris@16 130
Chris@16 131 template<class T> static void unused_var(const T&) {}
Chris@16 132
Chris@16 133 static time_rep_type get_time_rep(const date_type& day,
Chris@16 134 const time_duration_type& tod,
Chris@16 135 date_time::dst_flags dst=not_dst)
Chris@16 136 {
Chris@16 137 unused_var(dst);
Chris@16 138 return time_rep_type(day, tod);
Chris@16 139 }
Chris@16 140
Chris@16 141 static time_rep_type get_time_rep(special_values sv)
Chris@16 142 {
Chris@16 143 switch (sv) {
Chris@16 144 case not_a_date_time:
Chris@16 145 return time_rep_type(date_type(not_a_date_time),
Chris@16 146 time_duration_type(not_a_date_time));
Chris@16 147 case pos_infin:
Chris@16 148 return time_rep_type(date_type(pos_infin),
Chris@16 149 time_duration_type(pos_infin));
Chris@16 150 case neg_infin:
Chris@16 151 return time_rep_type(date_type(neg_infin),
Chris@16 152 time_duration_type(neg_infin));
Chris@16 153 case max_date_time: {
Chris@16 154 time_duration_type td = time_duration_type(24,0,0,0) - time_duration_type(0,0,0,1);
Chris@16 155 return time_rep_type(date_type(max_date_time), td);
Chris@16 156 }
Chris@16 157 case min_date_time:
Chris@16 158 return time_rep_type(date_type(min_date_time), time_duration_type(0,0,0,0));
Chris@16 159
Chris@16 160 default:
Chris@16 161 return time_rep_type(date_type(not_a_date_time),
Chris@16 162 time_duration_type(not_a_date_time));
Chris@16 163
Chris@16 164 }
Chris@16 165
Chris@16 166 }
Chris@16 167
Chris@16 168 static date_type get_date(const time_rep_type& val)
Chris@16 169 {
Chris@16 170 return val.date();
Chris@16 171 }
Chris@16 172 static time_duration_type get_time_of_day(const time_rep_type& val)
Chris@16 173 {
Chris@16 174 if(val.is_special()) {
Chris@16 175 return time_duration_type(val.get_rep().as_special());
Chris@16 176 }
Chris@16 177 else{
Chris@16 178 return time_duration_type(0,0,0,val.tod());
Chris@16 179 }
Chris@16 180 }
Chris@16 181 static std::string zone_name(const time_rep_type&)
Chris@16 182 {
Chris@16 183 return "";
Chris@16 184 }
Chris@16 185 static bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
Chris@16 186 {
Chris@16 187 return (lhs.time_count() == rhs.time_count());
Chris@16 188 }
Chris@16 189 static bool is_less(const time_rep_type& lhs, const time_rep_type& rhs)
Chris@16 190 {
Chris@16 191 return (lhs.time_count() < rhs.time_count());
Chris@16 192 }
Chris@16 193 static time_rep_type add_days(const time_rep_type& base,
Chris@16 194 const date_duration_type& dd)
Chris@16 195 {
Chris@16 196 if(base.is_special() || dd.is_special()) {
Chris@16 197 return(time_rep_type(base.get_rep() + dd.get_rep()));
Chris@16 198 }
Chris@16 199 else {
Chris@16 200 return time_rep_type(base.time_count() + (dd.days() * time_rep_type::frac_sec_per_day()));
Chris@16 201 }
Chris@16 202 }
Chris@16 203 static time_rep_type subtract_days(const time_rep_type& base,
Chris@16 204 const date_duration_type& dd)
Chris@16 205 {
Chris@16 206 if(base.is_special() || dd.is_special()) {
Chris@16 207 return(time_rep_type(base.get_rep() - dd.get_rep()));
Chris@16 208 }
Chris@16 209 else{
Chris@16 210 return time_rep_type(base.time_count() - (dd.days() * time_rep_type::frac_sec_per_day()));
Chris@16 211 }
Chris@16 212 }
Chris@16 213 static time_rep_type subtract_time_duration(const time_rep_type& base,
Chris@16 214 const time_duration_type& td)
Chris@16 215 {
Chris@16 216 if(base.is_special() || td.is_special()) {
Chris@16 217 return(time_rep_type(base.get_rep() - td.get_rep()));
Chris@16 218 }
Chris@16 219 else {
Chris@16 220 return time_rep_type(base.time_count() - td.ticks());
Chris@16 221 }
Chris@16 222 }
Chris@16 223 static time_rep_type add_time_duration(const time_rep_type& base,
Chris@16 224 time_duration_type td)
Chris@16 225 {
Chris@16 226 if(base.is_special() || td.is_special()) {
Chris@16 227 return(time_rep_type(base.get_rep() + td.get_rep()));
Chris@16 228 }
Chris@16 229 else {
Chris@16 230 return time_rep_type(base.time_count() + td.ticks());
Chris@16 231 }
Chris@16 232 }
Chris@16 233 static time_duration_type subtract_times(const time_rep_type& lhs,
Chris@16 234 const time_rep_type& rhs)
Chris@16 235 {
Chris@16 236 if(lhs.is_special() || rhs.is_special()) {
Chris@16 237 return(time_duration_type(
Chris@16 238 impl_type::to_special((lhs.get_rep() - rhs.get_rep()).as_number())));
Chris@16 239 }
Chris@16 240 else {
Chris@16 241 fractional_seconds_type fs = lhs.time_count() - rhs.time_count();
Chris@16 242 return time_duration_type(0,0,0,fs);
Chris@16 243 }
Chris@16 244 }
Chris@16 245
Chris@16 246 };
Chris@16 247
Chris@16 248
Chris@16 249 } } //namespace date_time
Chris@16 250
Chris@16 251
Chris@16 252
Chris@16 253 #endif
Chris@16 254