Chris@16: #ifndef GREG_DURATION_HPP___ Chris@16: #define GREG_DURATION_HPP___ 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: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace gregorian { Chris@16: Chris@16: //!An internal date representation that includes infinities, not a date Chris@16: typedef boost::date_time::duration_traits_adapted date_duration_rep; Chris@16: Chris@16: //! Durations in days for gregorian system Chris@16: /*! \ingroup date_basics Chris@16: */ Chris@16: class date_duration : Chris@16: public boost::date_time::date_duration< date_duration_rep > Chris@16: { Chris@16: typedef boost::date_time::date_duration< date_duration_rep > base_type; Chris@16: Chris@16: public: Chris@16: typedef base_type::duration_rep duration_rep; Chris@16: Chris@16: //! Construct from a day count Chris@16: explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {} Chris@16: Chris@16: //! construct from special_values Chris@16: date_duration(date_time::special_values sv) : base_type(sv) {} Chris@16: Chris@16: //! Copy constructor Chris@16: date_duration(const date_duration& other) : base_type(static_cast< base_type const& >(other)) Chris@16: {} Chris@16: Chris@16: //! Construct from another date_duration Chris@16: date_duration(const base_type& other) : base_type(other) Chris@16: {} Chris@16: Chris@16: // Relational operators Chris@16: // NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here, Chris@16: // because we need the class to be a direct base. Either lose EBO, or define operators by hand. Chris@16: // The latter is more effecient. Chris@16: bool operator== (const date_duration& rhs) const Chris@16: { Chris@16: return base_type::operator== (rhs); Chris@16: } Chris@16: bool operator!= (const date_duration& rhs) const Chris@16: { Chris@16: return !operator== (rhs); Chris@16: } Chris@16: bool operator< (const date_duration& rhs) const Chris@16: { Chris@16: return base_type::operator< (rhs); Chris@16: } Chris@16: bool operator> (const date_duration& rhs) const Chris@16: { Chris@16: return !(base_type::operator< (rhs) || base_type::operator== (rhs)); Chris@16: } Chris@16: bool operator<= (const date_duration& rhs) const Chris@16: { Chris@16: return (base_type::operator< (rhs) || base_type::operator== (rhs)); Chris@16: } Chris@16: bool operator>= (const date_duration& rhs) const Chris@16: { Chris@16: return !base_type::operator< (rhs); Chris@16: } Chris@16: Chris@16: //! Subtract another duration -- result is signed Chris@16: date_duration& operator-= (const date_duration& rhs) Chris@16: { Chris@16: base_type::operator-= (rhs); Chris@16: return *this; Chris@16: } Chris@16: friend date_duration operator- (date_duration rhs, date_duration const& lhs) Chris@16: { Chris@16: rhs -= lhs; Chris@16: return rhs; Chris@16: } Chris@16: Chris@16: //! Add a duration -- result is signed Chris@16: date_duration& operator+= (const date_duration& rhs) Chris@16: { Chris@16: base_type::operator+= (rhs); Chris@16: return *this; Chris@16: } Chris@16: friend date_duration operator+ (date_duration rhs, date_duration const& lhs) Chris@16: { Chris@16: rhs += lhs; Chris@16: return rhs; 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: Chris@16: //! Division operations on a duration with an integer. Chris@16: date_duration& operator/= (int divisor) Chris@16: { Chris@16: base_type::operator/= (divisor); Chris@16: return *this; Chris@16: } Chris@16: friend date_duration operator/ (date_duration rhs, int lhs) Chris@16: { Chris@16: rhs /= lhs; Chris@16: return rhs; Chris@16: } 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(base_type::unit().get_rep()); Chris@16: } Chris@16: }; Chris@16: Chris@16: //! Shorthand for date_duration Chris@16: typedef date_duration days; Chris@16: Chris@16: } } //namespace gregorian Chris@16: Chris@16: #if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES) Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #endif