diff DEPENDENCIES/generic/include/boost/date_time/date_duration.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/date_time/date_duration.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,146 @@
+#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: 2012-09-22 15:33:33 -0700 (Sat, 22 Sep 2012) $
+ */
+
+
+#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
+