1 #ifndef GREG_DURATION_HPP___ 2 #define GREG_DURATION_HPP___ 3 4 /* Copyright (c) 2002,2003, 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 <boost/date_time/compiler_config.hpp> 13 #include <boost/date_time/date_duration.hpp> 14 #include <boost/date_time/int_adapter.hpp> 15 #include <boost/date_time/special_defs.hpp> 16 17 namespace boost { 18 namespace gregorian { 19 20 //!An internal date representation that includes infinities, not a date 21 typedef boost::date_time::duration_traits_adapted date_duration_rep; 22 23 //! Durations in days for gregorian system 24 /*! \ingroup date_basics 25 */ 26 class BOOST_SYMBOL_VISIBLE date_duration : 27 public boost::date_time::date_duration< date_duration_rep > 28 { 29 typedef boost::date_time::date_duration< date_duration_rep > base_type; 30 31 public: 32 typedef base_type::duration_rep duration_rep; 33 34 //! Construct from a day count 35 BOOST_CXX14_CONSTEXPR explicit date_duration(duration_rep day_count=0)36 date_duration(duration_rep day_count = 0) : base_type(day_count) {} 37 38 //! construct from special_values 39 BOOST_CXX14_CONSTEXPR date_duration(date_time::special_values sv)40 date_duration(date_time::special_values sv) : base_type(sv) {} 41 42 //! Construct from another date_duration 43 BOOST_CXX14_CONSTEXPR date_duration(const base_type & other)44 date_duration(const base_type& other) : base_type(other) 45 {} 46 47 // Relational operators 48 // NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here, 49 // because we need the class to be a direct base. Either lose EBO, or define operators by hand. 50 // The latter is more effecient. operator ==(const date_duration & rhs) const51 BOOST_CXX14_CONSTEXPR bool operator== (const date_duration& rhs) const 52 { 53 return base_type::operator== (rhs); 54 } operator !=(const date_duration & rhs) const55 BOOST_CXX14_CONSTEXPR bool operator!= (const date_duration& rhs) const 56 { 57 return !operator== (rhs); 58 } operator <(const date_duration & rhs) const59 BOOST_CXX14_CONSTEXPR bool operator< (const date_duration& rhs) const 60 { 61 return base_type::operator< (rhs); 62 } operator >(const date_duration & rhs) const63 BOOST_CXX14_CONSTEXPR bool operator> (const date_duration& rhs) const 64 { 65 return !(base_type::operator< (rhs) || base_type::operator== (rhs)); 66 } operator <=(const date_duration & rhs) const67 BOOST_CXX14_CONSTEXPR bool operator<= (const date_duration& rhs) const 68 { 69 return (base_type::operator< (rhs) || base_type::operator== (rhs)); 70 } operator >=(const date_duration & rhs) const71 BOOST_CXX14_CONSTEXPR bool operator>= (const date_duration& rhs) const 72 { 73 return !base_type::operator< (rhs); 74 } 75 76 //! Subtract another duration -- result is signed operator -=(const date_duration & rhs)77 BOOST_CXX14_CONSTEXPR date_duration& operator-= (const date_duration& rhs) 78 { 79 base_type::operator-= (rhs); 80 return *this; 81 } 82 83 BOOST_CXX14_CONSTEXPR friend 84 date_duration operator- (date_duration rhs, date_duration const& lhs); 85 86 //! Add a duration -- result is signed operator +=(const date_duration & rhs)87 BOOST_CXX14_CONSTEXPR date_duration& operator+= (const date_duration& rhs) 88 { 89 base_type::operator+= (rhs); 90 return *this; 91 } 92 93 BOOST_CXX14_CONSTEXPR friend 94 date_duration operator+ (date_duration rhs, date_duration const& lhs); 95 96 //! unary- Allows for dd = -date_duration(2); -> dd == -2 operator -() const97 BOOST_CXX14_CONSTEXPR date_duration operator- ()const 98 { 99 return date_duration(get_rep() * (-1)); 100 } 101 102 //! Division operations on a duration with an integer. operator /=(int divisor)103 BOOST_CXX14_CONSTEXPR date_duration& operator/= (int divisor) 104 { 105 base_type::operator/= (divisor); 106 return *this; 107 } 108 109 BOOST_CXX14_CONSTEXPR friend date_duration operator/ (date_duration rhs, int lhs); 110 111 //! Returns the smallest duration -- used by to calculate 'end' unit()112 static BOOST_CXX14_CONSTEXPR date_duration unit() 113 { 114 return date_duration(base_type::unit().get_rep()); 115 } 116 }; 117 118 inline BOOST_CXX14_CONSTEXPR operator -(date_duration rhs,date_duration const & lhs)119 date_duration operator- (date_duration rhs, date_duration const& lhs) 120 { 121 rhs -= lhs; 122 return rhs; 123 } 124 125 inline BOOST_CXX14_CONSTEXPR operator +(date_duration rhs,date_duration const & lhs)126 date_duration operator+ (date_duration rhs, date_duration const& lhs) 127 { 128 rhs += lhs; 129 return rhs; 130 } 131 operator /(date_duration rhs,int lhs)132 inline BOOST_CXX14_CONSTEXPR date_duration operator/ (date_duration rhs, int lhs) 133 { 134 rhs /= lhs; 135 return rhs; 136 } 137 138 //! Shorthand for date_duration 139 typedef date_duration days; 140 141 } } //namespace gregorian 142 143 #if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES) 144 #include <boost/date_time/date_duration_types.hpp> 145 #endif 146 147 #endif 148