147 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #ifndef DATE_TIME_DATE_DURATION__
 | |
| #define DATE_TIME_DATE_DURATION__
 | |
| 
 | |
| /* 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$
 | |
|  */
 | |
| 
 | |
| 
 | |
| #include <boost/operators.hpp>
 | |
| #include <boost/date_time/special_defs.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace date_time {
 | |
| 
 | |
| 
 | |
|   //! Duration type with date level resolution
 | |
|   template<class duration_rep_traits>
 | |
|   class date_duration : private
 | |
|               boost::less_than_comparable1< date_duration< duration_rep_traits >
 | |
|             , boost::equality_comparable1< date_duration< duration_rep_traits >
 | |
|             , boost::addable1< date_duration< duration_rep_traits >
 | |
|             , boost::subtractable1< date_duration< duration_rep_traits >
 | |
|             , boost::dividable2< date_duration< duration_rep_traits >, int
 | |
|             > > > > >
 | |
|   {
 | |
|   public:
 | |
|     typedef typename duration_rep_traits::int_type duration_rep_type;
 | |
|     typedef typename duration_rep_traits::impl_type duration_rep;
 | |
| 
 | |
|     //! Construct from a day count
 | |
|     explicit date_duration(duration_rep day_count) : days_(day_count) {}
 | |
| 
 | |
|     /*! construct from special_values - only works when
 | |
|      * instantiated with duration_traits_adapted */
 | |
|     date_duration(special_values sv) :
 | |
|             days_(duration_rep::from_special(sv))
 | |
|     {}
 | |
| 
 | |
|     // copy constructor required for addable<> & subtractable<>
 | |
|     //! Construct from another date_duration (Copy Constructor)
 | |
|     date_duration(const date_duration<duration_rep_traits>& other) :
 | |
|             days_(other.days_)
 | |
|     {}
 | |
| 
 | |
|     //! returns days_ as it's instantiated type - used for streaming
 | |
|     duration_rep get_rep()const
 | |
|     {
 | |
|         return days_;
 | |
|     }
 | |
|     bool is_special()const
 | |
|     {
 | |
|         return days_.is_special();
 | |
|     }
 | |
|     //! returns days as value, not object.
 | |
|     duration_rep_type days() const
 | |
|     {
 | |
|         return duration_rep_traits::as_number(days_);
 | |
|     }
 | |
|     //! Returns the smallest duration -- used by to calculate 'end'
 | |
|     static date_duration unit()
 | |
|     {
 | |
|         return date_duration<duration_rep_traits>(1);
 | |
|     }
 | |
|     //! Equality
 | |
|     bool operator==(const date_duration& rhs) const
 | |
|     {
 | |
|         return days_ == rhs.days_;
 | |
|     }
 | |
|     //! Less
 | |
|     bool operator<(const date_duration& rhs) const
 | |
|     {
 | |
|         return days_ < rhs.days_;
 | |
|     }
 | |
| 
 | |
|     /* For shortcut operators (+=, -=, etc) simply using
 | |
|      * "days_ += days_" may not work. If instantiated with
 | |
|      * an int_adapter, shortcut operators are not present,
 | |
|      * so this will not compile */
 | |
| 
 | |
|     //! Subtract another duration -- result is signed
 | |
|     date_duration& operator-=(const date_duration& rhs)
 | |
|     {
 | |
|         //days_ -= rhs.days_;
 | |
|         days_ = days_ - rhs.days_;
 | |
|         return *this;
 | |
|     }
 | |
|     //! Add a duration -- result is signed
 | |
|     date_duration& operator+=(const date_duration& rhs)
 | |
|     {
 | |
|         days_ = days_ + rhs.days_;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     //! unary- Allows for dd = -date_duration(2); -> dd == -2
 | |
|     date_duration operator-() const
 | |
|     {
 | |
|         return date_duration<duration_rep_traits>(get_rep() * (-1));
 | |
|     }
 | |
|     //! Division operations on a duration with an integer.
 | |
|     date_duration& operator/=(int divisor)
 | |
|     {
 | |
|         days_ = days_ / divisor;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     //! return sign information
 | |
|     bool is_negative() const
 | |
|     {
 | |
|         return days_ < 0;
 | |
|     }
 | |
| 
 | |
|   private:
 | |
|     duration_rep days_;
 | |
|   };
 | |
| 
 | |
| 
 | |
|   /*! Struct for instantiating date_duration with <b>NO</b> special values
 | |
|    * functionality. Allows for transparent implementation of either
 | |
|    * date_duration<long> or date_duration<int_adapter<long> > */
 | |
|   struct duration_traits_long
 | |
|   {
 | |
|     typedef long int_type;
 | |
|     typedef long impl_type;
 | |
|     static int_type as_number(impl_type i) { return i; }
 | |
|   };
 | |
| 
 | |
|   /*! Struct for instantiating date_duration <b>WITH</b> special values
 | |
|    * functionality. Allows for transparent implementation of either
 | |
|    * date_duration<long> or date_duration<int_adapter<long> > */
 | |
|   struct duration_traits_adapted
 | |
|   {
 | |
|     typedef long int_type;
 | |
|     typedef boost::date_time::int_adapter<long> impl_type;
 | |
|     static int_type as_number(impl_type i) { return i.as_number(); }
 | |
|   };
 | |
| 
 | |
| 
 | |
| } } //namspace date_time
 | |
| 
 | |
| 
 | |
| #endif
 | |
| 
 | 
