Chris@16
|
1 #ifndef GREG_DURATION_HPP___
|
Chris@16
|
2 #define GREG_DURATION_HPP___
|
Chris@16
|
3
|
Chris@16
|
4 /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
Chris@16
|
5 * Use, modification and distribution is subject to the
|
Chris@16
|
6 * Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
7 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 * Author: Jeff Garland, Bart Garst
|
Chris@101
|
9 * $Date$
|
Chris@16
|
10 */
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/date_time/date_duration.hpp>
|
Chris@16
|
13 #include <boost/date_time/int_adapter.hpp>
|
Chris@16
|
14 #include <boost/date_time/special_defs.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost {
|
Chris@16
|
17 namespace gregorian {
|
Chris@16
|
18
|
Chris@16
|
19 //!An internal date representation that includes infinities, not a date
|
Chris@16
|
20 typedef boost::date_time::duration_traits_adapted date_duration_rep;
|
Chris@16
|
21
|
Chris@16
|
22 //! Durations in days for gregorian system
|
Chris@16
|
23 /*! \ingroup date_basics
|
Chris@16
|
24 */
|
Chris@16
|
25 class date_duration :
|
Chris@16
|
26 public boost::date_time::date_duration< date_duration_rep >
|
Chris@16
|
27 {
|
Chris@16
|
28 typedef boost::date_time::date_duration< date_duration_rep > base_type;
|
Chris@16
|
29
|
Chris@16
|
30 public:
|
Chris@16
|
31 typedef base_type::duration_rep duration_rep;
|
Chris@16
|
32
|
Chris@16
|
33 //! Construct from a day count
|
Chris@16
|
34 explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {}
|
Chris@16
|
35
|
Chris@16
|
36 //! construct from special_values
|
Chris@16
|
37 date_duration(date_time::special_values sv) : base_type(sv) {}
|
Chris@16
|
38
|
Chris@16
|
39 //! Copy constructor
|
Chris@16
|
40 date_duration(const date_duration& other) : base_type(static_cast< base_type const& >(other))
|
Chris@16
|
41 {}
|
Chris@16
|
42
|
Chris@16
|
43 //! Construct from another date_duration
|
Chris@16
|
44 date_duration(const base_type& other) : base_type(other)
|
Chris@16
|
45 {}
|
Chris@16
|
46
|
Chris@16
|
47 // Relational operators
|
Chris@16
|
48 // NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here,
|
Chris@16
|
49 // because we need the class to be a direct base. Either lose EBO, or define operators by hand.
|
Chris@16
|
50 // The latter is more effecient.
|
Chris@16
|
51 bool operator== (const date_duration& rhs) const
|
Chris@16
|
52 {
|
Chris@16
|
53 return base_type::operator== (rhs);
|
Chris@16
|
54 }
|
Chris@16
|
55 bool operator!= (const date_duration& rhs) const
|
Chris@16
|
56 {
|
Chris@16
|
57 return !operator== (rhs);
|
Chris@16
|
58 }
|
Chris@16
|
59 bool operator< (const date_duration& rhs) const
|
Chris@16
|
60 {
|
Chris@16
|
61 return base_type::operator< (rhs);
|
Chris@16
|
62 }
|
Chris@16
|
63 bool operator> (const date_duration& rhs) const
|
Chris@16
|
64 {
|
Chris@16
|
65 return !(base_type::operator< (rhs) || base_type::operator== (rhs));
|
Chris@16
|
66 }
|
Chris@16
|
67 bool operator<= (const date_duration& rhs) const
|
Chris@16
|
68 {
|
Chris@16
|
69 return (base_type::operator< (rhs) || base_type::operator== (rhs));
|
Chris@16
|
70 }
|
Chris@16
|
71 bool operator>= (const date_duration& rhs) const
|
Chris@16
|
72 {
|
Chris@16
|
73 return !base_type::operator< (rhs);
|
Chris@16
|
74 }
|
Chris@16
|
75
|
Chris@16
|
76 //! Subtract another duration -- result is signed
|
Chris@16
|
77 date_duration& operator-= (const date_duration& rhs)
|
Chris@16
|
78 {
|
Chris@16
|
79 base_type::operator-= (rhs);
|
Chris@16
|
80 return *this;
|
Chris@16
|
81 }
|
Chris@16
|
82 friend date_duration operator- (date_duration rhs, date_duration const& lhs)
|
Chris@16
|
83 {
|
Chris@16
|
84 rhs -= lhs;
|
Chris@16
|
85 return rhs;
|
Chris@16
|
86 }
|
Chris@16
|
87
|
Chris@16
|
88 //! Add a duration -- result is signed
|
Chris@16
|
89 date_duration& operator+= (const date_duration& rhs)
|
Chris@16
|
90 {
|
Chris@16
|
91 base_type::operator+= (rhs);
|
Chris@16
|
92 return *this;
|
Chris@16
|
93 }
|
Chris@16
|
94 friend date_duration operator+ (date_duration rhs, date_duration const& lhs)
|
Chris@16
|
95 {
|
Chris@16
|
96 rhs += lhs;
|
Chris@16
|
97 return rhs;
|
Chris@16
|
98 }
|
Chris@16
|
99
|
Chris@16
|
100 //! unary- Allows for dd = -date_duration(2); -> dd == -2
|
Chris@16
|
101 date_duration operator- ()const
|
Chris@16
|
102 {
|
Chris@16
|
103 return date_duration(get_rep() * (-1));
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 //! Division operations on a duration with an integer.
|
Chris@16
|
107 date_duration& operator/= (int divisor)
|
Chris@16
|
108 {
|
Chris@16
|
109 base_type::operator/= (divisor);
|
Chris@16
|
110 return *this;
|
Chris@16
|
111 }
|
Chris@16
|
112 friend date_duration operator/ (date_duration rhs, int lhs)
|
Chris@16
|
113 {
|
Chris@16
|
114 rhs /= lhs;
|
Chris@16
|
115 return rhs;
|
Chris@16
|
116 }
|
Chris@16
|
117
|
Chris@16
|
118 //! Returns the smallest duration -- used by to calculate 'end'
|
Chris@16
|
119 static date_duration unit()
|
Chris@16
|
120 {
|
Chris@16
|
121 return date_duration(base_type::unit().get_rep());
|
Chris@16
|
122 }
|
Chris@16
|
123 };
|
Chris@16
|
124
|
Chris@16
|
125 //! Shorthand for date_duration
|
Chris@16
|
126 typedef date_duration days;
|
Chris@16
|
127
|
Chris@16
|
128 } } //namespace gregorian
|
Chris@16
|
129
|
Chris@16
|
130 #if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
|
Chris@16
|
131 #include <boost/date_time/date_duration_types.hpp>
|
Chris@16
|
132 #endif
|
Chris@16
|
133
|
Chris@16
|
134 #endif
|