| #ifndef GREG_DURATION_HPP___ |
| #define GREG_DURATION_HPP___ |
| |
| /* Copyright (c) 2002,2003 CrystalClear Software, Inc. |
| * Use, modification and distribution is subject to the |
| * Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| * Author: Jeff Garland, Bart Garst |
| * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $ |
| */ |
| |
| #include <boost/date_time/date_duration.hpp> |
| #include <boost/date_time/int_adapter.hpp> |
| #include <boost/date_time/special_defs.hpp> |
| |
| namespace boost { |
| namespace gregorian { |
| |
| //!An internal date representation that includes infinities, not a date |
| typedef boost::date_time::duration_traits_adapted date_duration_rep; |
| |
| //! Durations in days for gregorian system |
| /*! \ingroup date_basics |
| */ |
| class date_duration : |
| public boost::date_time::date_duration< date_duration_rep > |
| { |
| typedef boost::date_time::date_duration< date_duration_rep > base_type; |
| |
| public: |
| typedef base_type::duration_rep duration_rep; |
| |
| //! Construct from a day count |
| explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {} |
| |
| //! construct from special_values |
| date_duration(date_time::special_values sv) : base_type(sv) {} |
| |
| //! Copy constructor |
| date_duration(const date_duration& other) : base_type(static_cast< base_type const& >(other)) |
| {} |
| |
| //! Construct from another date_duration |
| date_duration(const base_type& other) : base_type(other) |
| {} |
| |
| // Relational operators |
| // NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here, |
| // because we need the class to be a direct base. Either lose EBO, or define operators by hand. |
| // The latter is more effecient. |
| bool operator== (const date_duration& rhs) const |
| { |
| return base_type::operator== (rhs); |
| } |
| bool operator!= (const date_duration& rhs) const |
| { |
| return !operator== (rhs); |
| } |
| bool operator< (const date_duration& rhs) const |
| { |
| return base_type::operator< (rhs); |
| } |
| bool operator> (const date_duration& rhs) const |
| { |
| return !(base_type::operator< (rhs) || base_type::operator== (rhs)); |
| } |
| bool operator<= (const date_duration& rhs) const |
| { |
| return (base_type::operator< (rhs) || base_type::operator== (rhs)); |
| } |
| bool operator>= (const date_duration& rhs) const |
| { |
| return !base_type::operator< (rhs); |
| } |
| |
| //! Subtract another duration -- result is signed |
| date_duration& operator-= (const date_duration& rhs) |
| { |
| base_type::operator-= (rhs); |
| return *this; |
| } |
| friend date_duration operator- (date_duration rhs, date_duration const& lhs) |
| { |
| rhs -= lhs; |
| return rhs; |
| } |
| |
| //! Add a duration -- result is signed |
| date_duration& operator+= (const date_duration& rhs) |
| { |
| base_type::operator+= (rhs); |
| return *this; |
| } |
| friend date_duration operator+ (date_duration rhs, date_duration const& lhs) |
| { |
| rhs += lhs; |
| return rhs; |
| } |
| |
| //! unary- Allows for dd = -date_duration(2); -> dd == -2 |
| date_duration operator- ()const |
| { |
| return date_duration(get_rep() * (-1)); |
| } |
| |
| //! Division operations on a duration with an integer. |
| date_duration& operator/= (int divisor) |
| { |
| base_type::operator/= (divisor); |
| return *this; |
| } |
| friend date_duration operator/ (date_duration rhs, int lhs) |
| { |
| rhs /= lhs; |
| return rhs; |
| } |
| |
| //! Returns the smallest duration -- used by to calculate 'end' |
| static date_duration unit() |
| { |
| return date_duration(base_type::unit().get_rep()); |
| } |
| }; |
| |
| //! Shorthand for date_duration |
| typedef date_duration days; |
| |
| } } //namespace gregorian |
| |
| #if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES) |
| #include <boost/date_time/date_duration_types.hpp> |
| #endif |
| |
| #endif |