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