Chris@16: #ifndef DATE_TIME_DATE_DURATION__ Chris@16: #define DATE_TIME_DATE_DURATION__ Chris@16: Chris@16: /* Copyright (c) 2002,2003 CrystalClear Software, Inc. Chris@16: * Use, modification and distribution is subject to the Chris@16: * Boost Software License, Version 1.0. (See accompanying Chris@16: * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) Chris@16: * Author: Jeff Garland, Bart Garst Chris@101: * $Date$ Chris@16: */ Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace date_time { Chris@16: Chris@16: Chris@16: //! Duration type with date level resolution Chris@16: template Chris@16: class date_duration : private Chris@16: boost::less_than_comparable1< date_duration< duration_rep_traits > Chris@16: , boost::equality_comparable1< date_duration< duration_rep_traits > Chris@16: , boost::addable1< date_duration< duration_rep_traits > Chris@16: , boost::subtractable1< date_duration< duration_rep_traits > Chris@16: , boost::dividable2< date_duration< duration_rep_traits >, int Chris@16: > > > > > Chris@16: { Chris@16: public: Chris@16: typedef typename duration_rep_traits::int_type duration_rep_type; Chris@16: typedef typename duration_rep_traits::impl_type duration_rep; Chris@16: Chris@16: //! Construct from a day count Chris@16: explicit date_duration(duration_rep day_count) : days_(day_count) {} Chris@16: Chris@16: /*! construct from special_values - only works when Chris@16: * instantiated with duration_traits_adapted */ Chris@16: date_duration(special_values sv) : Chris@16: days_(duration_rep::from_special(sv)) Chris@16: {} Chris@16: Chris@16: // copy constructor required for addable<> & subtractable<> Chris@16: //! Construct from another date_duration (Copy Constructor) Chris@16: date_duration(const date_duration& other) : Chris@16: days_(other.days_) Chris@16: {} Chris@16: Chris@16: //! returns days_ as it's instantiated type - used for streaming Chris@16: duration_rep get_rep()const Chris@16: { Chris@16: return days_; Chris@16: } Chris@16: bool is_special()const Chris@16: { Chris@16: return days_.is_special(); Chris@16: } Chris@16: //! returns days as value, not object. Chris@16: duration_rep_type days() const Chris@16: { Chris@16: return duration_rep_traits::as_number(days_); Chris@16: } Chris@16: //! Returns the smallest duration -- used by to calculate 'end' Chris@16: static date_duration unit() Chris@16: { Chris@16: return date_duration(1); Chris@16: } Chris@16: //! Equality Chris@16: bool operator==(const date_duration& rhs) const Chris@16: { Chris@16: return days_ == rhs.days_; Chris@16: } Chris@16: //! Less Chris@16: bool operator<(const date_duration& rhs) const Chris@16: { Chris@16: return days_ < rhs.days_; Chris@16: } Chris@16: Chris@16: /* For shortcut operators (+=, -=, etc) simply using Chris@16: * "days_ += days_" may not work. If instantiated with Chris@16: * an int_adapter, shortcut operators are not present, Chris@16: * so this will not compile */ Chris@16: Chris@16: //! Subtract another duration -- result is signed Chris@16: date_duration& operator-=(const date_duration& rhs) Chris@16: { Chris@16: //days_ -= rhs.days_; Chris@16: days_ = days_ - rhs.days_; Chris@16: return *this; Chris@16: } Chris@16: //! Add a duration -- result is signed Chris@16: date_duration& operator+=(const date_duration& rhs) Chris@16: { Chris@16: days_ = days_ + rhs.days_; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: //! unary- Allows for dd = -date_duration(2); -> dd == -2 Chris@16: date_duration operator-() const Chris@16: { Chris@16: return date_duration(get_rep() * (-1)); Chris@16: } Chris@16: //! Division operations on a duration with an integer. Chris@16: date_duration& operator/=(int divisor) Chris@16: { Chris@16: days_ = days_ / divisor; Chris@16: return *this; Chris@16: } Chris@16: Chris@16: //! return sign information Chris@16: bool is_negative() const Chris@16: { Chris@16: return days_ < 0; Chris@16: } Chris@16: Chris@16: private: Chris@16: duration_rep days_; Chris@16: }; Chris@16: Chris@16: Chris@16: /*! Struct for instantiating date_duration with NO special values Chris@16: * functionality. Allows for transparent implementation of either Chris@16: * date_duration or date_duration > */ Chris@16: struct duration_traits_long Chris@16: { Chris@16: typedef long int_type; Chris@16: typedef long impl_type; Chris@16: static int_type as_number(impl_type i) { return i; } Chris@16: }; Chris@16: Chris@16: /*! Struct for instantiating date_duration WITH special values Chris@16: * functionality. Allows for transparent implementation of either Chris@16: * date_duration or date_duration > */ Chris@16: struct duration_traits_adapted Chris@16: { Chris@16: typedef long int_type; Chris@16: typedef boost::date_time::int_adapter impl_type; Chris@16: static int_type as_number(impl_type i) { return i.as_number(); } Chris@16: }; Chris@16: Chris@16: Chris@16: } } //namspace date_time Chris@16: Chris@16: Chris@16: #endif Chris@16: