annotate DEPENDENCIES/generic/include/boost/date_time/date_duration.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
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