imgtools/imglib/boostlibrary/boost/date_time/date_iterator.hpp
changeset 2 39c28ec933dd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/date_time/date_iterator.hpp	Mon May 10 19:54:49 2010 +0100
@@ -0,0 +1,101 @@
+#ifndef DATE_ITERATOR_HPP___
+#define DATE_ITERATOR_HPP___
+
+/* 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: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ */
+
+#include <iterator>
+
+namespace boost {
+namespace date_time {
+  //! An iterator over dates with varying resolution (day, week, month, year, etc)
+  enum date_resolutions {day, week, months, year, decade, century, NumDateResolutions};
+
+  //! Base date iterator type
+  /*! This class provides the skeleton for the creation of iterators.
+   *  New and interesting interators can be created by plugging in a new
+   *  function that derives the next value from the current state.
+   *  generation of various types of -based information.
+   *
+   *  <b>Template Parameters</b>
+   *
+   *  <b>date_type</b>
+   *
+   *  The date_type is a concrete date_type. The date_type must
+   *  define a duration_type and a calendar_type.
+   */
+  template<class date_type>
+  class date_itr_base {
+  // works, but benefit unclear at the moment
+  //   class date_itr_base : public std::iterator<std::input_iterator_tag, 
+  //                                             date_type, void, void, void>{
+  public:
+    typedef typename date_type::duration_type duration_type;
+    typedef date_type value_type;
+    typedef std::input_iterator_tag iterator_category;
+
+    date_itr_base(date_type d) : current_(d) {}
+    virtual ~date_itr_base() {};
+    date_itr_base& operator++() 
+    {
+      current_ = current_ + get_offset(current_);
+      return *this;
+    }
+    date_itr_base& operator--() 
+    {
+      current_ = current_ + get_neg_offset(current_);
+      return *this;
+    }
+    virtual duration_type get_offset(const date_type& current) const=0;
+    virtual duration_type get_neg_offset(const date_type& current) const=0;
+    date_type operator*() {return current_;};
+    date_type* operator->() {return &current_;};
+    bool operator<  (const date_type& d) {return current_ < d;}
+    bool operator<= (const date_type& d) {return current_ <= d;}
+    bool operator>  (const date_type& d) {return current_ > d;}
+    bool operator>= (const date_type& d) {return current_ >= d;}
+    bool operator== (const date_type& d) {return current_ == d;}
+    bool operator!= (const date_type& d) {return current_ != d;}    
+  private:
+    date_type current_;
+  };
+  
+  //! Overrides the base date iterator providing hook for functors
+  /*
+   *  <b>offset_functor</b>
+   *
+   *  The offset functor must define a get_offset function that takes the
+   *  current point in time and calculates and offset.
+   *
+   */
+  template<class offset_functor, class date_type>
+  class date_itr : public date_itr_base<date_type> {
+  public:
+    typedef typename date_type::duration_type duration_type;
+    date_itr(date_type d, int factor=1) : 
+      date_itr_base<date_type>(d), 
+      of_(factor) 
+    {}
+  private:
+    virtual duration_type get_offset(const date_type& current) const
+    {
+      return of_.get_offset(current);
+    }
+    virtual duration_type get_neg_offset(const date_type& current) const
+    {
+      return of_.get_neg_offset(current);
+    }
+    offset_functor of_;
+  };
+  
+
+  
+} } //namespace date_time
+
+
+#endif