Line data Source code
1 : #ifndef DATE_TIME_DATE_DURATION__ 2 : #define DATE_TIME_DATE_DURATION__ 3 : 4 : /* Copyright (c) 2002,2003 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 : 13 : #include <boost/operators.hpp> 14 : #include <boost/date_time/special_defs.hpp> 15 : #include <boost/date_time/compiler_config.hpp> 16 : #include <boost/date_time/int_adapter.hpp> 17 : 18 : namespace boost { 19 : namespace date_time { 20 : 21 : 22 : //! Duration type with date level resolution 23 : template<class duration_rep_traits> 24 : class BOOST_SYMBOL_VISIBLE date_duration : private 25 : boost::less_than_comparable1< date_duration< duration_rep_traits > 26 : , boost::equality_comparable1< date_duration< duration_rep_traits > 27 : , boost::addable1< date_duration< duration_rep_traits > 28 : , boost::subtractable1< date_duration< duration_rep_traits > 29 : , boost::dividable2< date_duration< duration_rep_traits >, int 30 : > > > > > 31 : { 32 : public: 33 : typedef typename duration_rep_traits::int_type duration_rep_type; 34 : typedef typename duration_rep_traits::impl_type duration_rep; 35 : 36 : //! Construct from a day count 37 0 : BOOST_CXX14_CONSTEXPR explicit date_duration(duration_rep day_count) : days_(day_count) {} 38 : 39 : /*! construct from special_values - only works when 40 : * instantiated with duration_traits_adapted */ 41 : BOOST_CXX14_CONSTEXPR date_duration(special_values sv) : 42 : days_(duration_rep::from_special(sv)) 43 : {} 44 : 45 : //! returns days_ as it's instantiated type - used for streaming 46 0 : BOOST_CXX14_CONSTEXPR duration_rep get_rep()const 47 : { 48 0 : return days_; 49 : } 50 : BOOST_CXX14_CONSTEXPR special_values as_special() const 51 : { 52 : return days_.as_special(); 53 : } 54 0 : BOOST_CXX14_CONSTEXPR bool is_special()const 55 : { 56 0 : return days_.is_special(); 57 : } 58 : //! returns days as value, not object. 59 0 : BOOST_CXX14_CONSTEXPR duration_rep_type days() const 60 : { 61 0 : return duration_rep_traits::as_number(days_); 62 : } 63 : //! Returns the smallest duration -- used by to calculate 'end' 64 : static BOOST_CXX14_CONSTEXPR date_duration unit() 65 : { 66 : return date_duration<duration_rep_traits>(1); 67 : } 68 : //! Equality 69 : BOOST_CXX14_CONSTEXPR bool operator==(const date_duration& rhs) const 70 : { 71 : return days_ == rhs.days_; 72 : } 73 : //! Less 74 : BOOST_CXX14_CONSTEXPR bool operator<(const date_duration& rhs) const 75 : { 76 : return days_ < rhs.days_; 77 : } 78 : 79 : /* For shortcut operators (+=, -=, etc) simply using 80 : * "days_ += days_" may not work. If instantiated with 81 : * an int_adapter, shortcut operators are not present, 82 : * so this will not compile */ 83 : 84 : //! Subtract another duration -- result is signed 85 : BOOST_CXX14_CONSTEXPR date_duration& operator-=(const date_duration& rhs) 86 : { 87 : //days_ -= rhs.days_; 88 : days_ = days_ - rhs.days_; 89 : return *this; 90 : } 91 : //! Add a duration -- result is signed 92 : BOOST_CXX14_CONSTEXPR date_duration& operator+=(const date_duration& rhs) 93 : { 94 : days_ = days_ + rhs.days_; 95 : return *this; 96 : } 97 : 98 : //! unary- Allows for dd = -date_duration(2); -> dd == -2 99 : BOOST_CXX14_CONSTEXPR date_duration operator-() const 100 : { 101 : return date_duration<duration_rep_traits>(get_rep() * (-1)); 102 : } 103 : //! Division operations on a duration with an integer. 104 : BOOST_CXX14_CONSTEXPR date_duration& operator/=(int divisor) 105 : { 106 : days_ = days_ / divisor; 107 : return *this; 108 : } 109 : 110 : //! return sign information 111 : BOOST_CXX14_CONSTEXPR bool is_negative() const 112 : { 113 : return days_ < 0; 114 : } 115 : 116 : private: 117 : duration_rep days_; 118 : }; 119 : 120 : 121 : /*! Struct for instantiating date_duration with <b>NO</b> special values 122 : * functionality. Allows for transparent implementation of either 123 : * date_duration<long> or date_duration<int_adapter<long> > */ 124 : struct BOOST_SYMBOL_VISIBLE duration_traits_long 125 : { 126 : typedef long int_type; 127 : typedef long impl_type; 128 : static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i) { return i; } 129 : }; 130 : 131 : /*! Struct for instantiating date_duration <b>WITH</b> special values 132 : * functionality. Allows for transparent implementation of either 133 : * date_duration<long> or date_duration<int_adapter<long> > */ 134 : struct BOOST_SYMBOL_VISIBLE duration_traits_adapted 135 : { 136 : typedef long int_type; 137 : typedef boost::date_time::int_adapter<long> impl_type; 138 0 : static BOOST_CXX14_CONSTEXPR int_type as_number(impl_type i) { return i.as_number(); } 139 : }; 140 : 141 : 142 : } } //namspace date_time 143 : 144 : 145 : #endif 146 :