00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_SEQ_IMPL_SEQUENCE_LIST_ITERATOR_HH
00020 #define OST_SEQ_IMPL_SEQUENCE_LIST_ITERATOR_HH
00021
00022
00023
00024
00025
00026 #include <ost/seq/module_config.hh>
00027 namespace ost { namespace seq { namespace impl {
00028
00030 template <typename T, typename I>
00031 class TEMPLATE_EXPORT SequenceListIterator
00032 : public std::iterator<std::random_access_iterator_tag, T>{
00033 public:
00034 typedef T ValueType;
00035 typedef I IteratorType;
00036 typedef SequenceListIterator<T, I> ClassType;
00037 protected:
00038 void UpdateVal()
00039 {
00040 if (current_it_<end_) {
00041 current_val_=ValueType(*current_it_);
00042 }
00043 }
00044 public:
00045 SequenceListIterator(IteratorType it, IteratorType end):
00046 current_it_(it), end_(end)
00047 {
00048 this->UpdateVal();
00049 }
00050
00051 ValueType& operator*()
00052 {
00053 return current_val_;
00054 }
00055
00056 ValueType* operator->()
00057 {
00058 return ¤t_val_;
00059 }
00060
00061 ClassType& operator++() {
00062 ++current_it_;
00063 this->UpdateVal();
00064 return *this;
00065 }
00066
00067 ClassType& operator+=(int n) {
00068 current_it_+=n;
00069 this->UpdateVal();
00070 return *this;
00071 }
00072 ClassType operator+(int n) {
00073 ClassType ans(current_it_, end_);
00074 ans+=n;
00075 return *this;
00076 }
00077 ClassType& operator-=(int n) {
00078 current_it_-=n;
00079 this->UpdateVal();
00080 return *this;
00081 }
00082
00083 ClassType operator++(int) {
00084 ClassType ans(*this);
00085 ++current_it_;
00086 this->UpdateVal();
00087 return ans;
00088 }
00089
00090 bool operator==(const ClassType& rhs) const
00091 {
00092 return current_it_==rhs.current_it_;
00093 }
00094
00095 bool operator!=(const ClassType& rhs) const
00096 {
00097 return !(*this==rhs);
00098 }
00099 private:
00100 IteratorType current_it_;
00101 IteratorType end_;
00102 ValueType current_val_;
00103 };
00104
00105 }}}
00106
00107 #endif