File indexing completed on 2025-01-18 09:30:40
0001 #ifndef _DATE_TIME_WRAPPING_INT_HPP__
0002 #define _DATE_TIME_WRAPPING_INT_HPP__
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "boost/config.hpp"
0013
0014 namespace boost {
0015 namespace date_time {
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 template<typename int_type_, int_type_ wrap_val>
0032 class wrapping_int {
0033 public:
0034 typedef int_type_ int_type;
0035
0036 static BOOST_CONSTEXPR int_type wrap_value() {return wrap_val;}
0037
0038 BOOST_CXX14_CONSTEXPR wrapping_int(int_type v) : value_(v) {}
0039
0040 BOOST_CONSTEXPR int_type as_int() const {return value_;}
0041 BOOST_CONSTEXPR operator int_type() const {return value_;}
0042
0043
0044
0045
0046
0047 template< typename IntT >
0048 BOOST_CXX14_CONSTEXPR IntT add(IntT v)
0049 {
0050 int_type remainder = static_cast<int_type>(v % (wrap_val));
0051 IntT overflow = static_cast<IntT>(v / (wrap_val));
0052 value_ = static_cast<int_type>(value_ + remainder);
0053 return calculate_wrap(overflow);
0054 }
0055
0056
0057
0058
0059
0060
0061 template< typename IntT >
0062 BOOST_CXX14_CONSTEXPR IntT subtract(IntT v)
0063 {
0064 int_type remainder = static_cast<int_type>(v % (wrap_val));
0065 IntT underflow = static_cast<IntT>(-(v / (wrap_val)));
0066 value_ = static_cast<int_type>(value_ - remainder);
0067 return calculate_wrap(underflow) * -1;
0068 }
0069 private:
0070 int_type value_;
0071
0072 template< typename IntT >
0073 BOOST_CXX14_CONSTEXPR IntT calculate_wrap(IntT wrap)
0074 {
0075 if ((value_) >= wrap_val)
0076 {
0077 ++wrap;
0078 value_ -= (wrap_val);
0079 }
0080 else if(value_ < 0)
0081 {
0082 --wrap;
0083 value_ += (wrap_val);
0084 }
0085 return wrap;
0086 }
0087
0088 };
0089
0090
0091
0092
0093
0094
0095 template<typename int_type_, int_type_ wrap_min, int_type_ wrap_max>
0096 class wrapping_int2 {
0097 public:
0098 typedef int_type_ int_type;
0099 static BOOST_CONSTEXPR int_type wrap_value() {return wrap_max;}
0100 static BOOST_CONSTEXPR int_type min_value() {return wrap_min;}
0101
0102
0103 BOOST_CXX14_CONSTEXPR wrapping_int2(int_type v) : value_(v) {
0104 if(value_ < wrap_min)
0105 {
0106 value_ = wrap_min;
0107 }
0108 if(value_ > wrap_max)
0109 {
0110 value_ = wrap_max;
0111 }
0112 }
0113
0114 BOOST_CONSTEXPR int_type as_int() const {return value_;}
0115 BOOST_CONSTEXPR operator int_type() const {return value_;}
0116
0117
0118
0119
0120
0121 template< typename IntT >
0122 BOOST_CXX14_CONSTEXPR IntT add(IntT v)
0123 {
0124 int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
0125 IntT overflow = static_cast<IntT>(v / (wrap_max - wrap_min + 1));
0126 value_ = static_cast<int_type>(value_ + remainder);
0127 return calculate_wrap(overflow);
0128 }
0129
0130
0131
0132
0133
0134 template< typename IntT >
0135 BOOST_CXX14_CONSTEXPR IntT subtract(IntT v)
0136 {
0137 int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
0138 IntT underflow = static_cast<IntT>(-(v / (wrap_max - wrap_min + 1)));
0139 value_ = static_cast<int_type>(value_ - remainder);
0140 return calculate_wrap(underflow);
0141 }
0142
0143 private:
0144 int_type value_;
0145
0146 template< typename IntT >
0147 BOOST_CXX14_CONSTEXPR IntT calculate_wrap(IntT wrap)
0148 {
0149 if ((value_) > wrap_max)
0150 {
0151 ++wrap;
0152 value_ -= (wrap_max - wrap_min + 1);
0153 }
0154 else if((value_) < wrap_min)
0155 {
0156 --wrap;
0157 value_ += (wrap_max - wrap_min + 1);
0158 }
0159 return wrap;
0160 }
0161 };
0162
0163
0164
0165 } }
0166
0167
0168
0169 #endif
0170