123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #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$
- */
- #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;
- const date_type& operator*() const {return current_;}
- const date_type* operator->() const {return ¤t_;}
- bool operator< (const date_type& d) const {return current_ < d;}
- bool operator<= (const date_type& d) const {return current_ <= d;}
- bool operator> (const date_type& d) const {return current_ > d;}
- bool operator>= (const date_type& d) const {return current_ >= d;}
- bool operator== (const date_type& d) const {return current_ == d;}
- bool operator!= (const date_type& d) const {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
|