00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef FILTER_ITERATOR_H
00024 #define FILTER_ITERATOR_H
00025
00026 #include "y2storage/AppUtil.h"
00027 #include "y2storage/IterPair.h"
00028
00029 namespace storage
00030 {
00031
00032 template< class Pred, class Iter >
00033 class FilterIterator : public std::iterator<std::bidirectional_iterator_tag,
00034 typename Iter::value_type>
00035 {
00036 public:
00037 typedef typename Iter::value_type value_type;
00038 typedef typename Iter::reference reference;
00039 typedef typename Iter::pointer pointer;
00040 typedef typename Iter::difference_type difference_type;
00041 typedef typename Iter::iterator_category iterator_category;
00042
00043 FilterIterator() { }
00044
00045 FilterIterator( const Iter& begin, const Iter& end, Pred f, bool setend=false ) :
00046 m_begin(begin), m_end(end), m_cur(begin), m_f(f)
00047 {
00048 initialize( setend );
00049 }
00050 FilterIterator( const IterPair<Iter>& p, Pred f, bool setend=false ) :
00051 m_begin(p.begin()), m_end(p.end()), m_cur(p.begin()), m_f(f)
00052 {
00053 initialize( setend );
00054 }
00055
00056 FilterIterator( const FilterIterator& x )
00057 {
00058 copyMembers( x );
00059 }
00060
00061 FilterIterator& operator=(const FilterIterator& x)
00062 {
00063 copyMembers( x );
00064 return *this;
00065 }
00066
00067 FilterIterator& operator++()
00068 {
00069 ++m_cur;
00070 assertPred();
00071 return *this;
00072 }
00073 FilterIterator operator++(int)
00074 {
00075 y2war( "Expensive ++ FilterIterator" );
00076 FilterIterator tmp(*this);
00077 ++m_cur;
00078 assertPred();
00079 return tmp;
00080 }
00081
00082 FilterIterator& operator--()
00083 {
00084 --m_cur;
00085 assertPred(false);
00086 return *this;
00087 }
00088 FilterIterator operator--(int)
00089 {
00090 y2war( "Expensive -- FilterIterator" );
00091 FilterIterator tmp(*this);
00092 --m_cur;
00093 assertPred(false);
00094 return tmp;
00095 }
00096
00097 value_type operator*() const
00098 {
00099 return( *m_cur );
00100 }
00101
00102 pointer operator->() const
00103 {
00104 return( &(*m_cur) );
00105 }
00106 bool operator==(const FilterIterator& x) const
00107 {
00108 return( m_cur == x.cur() );
00109 }
00110 bool operator!=(const FilterIterator& x) const
00111 {
00112 return( m_cur != x.cur() );
00113 }
00114
00115 Pred pred() const {return m_f;}
00116 Iter end() const {return m_end;}
00117 Iter cur() const {return m_cur;}
00118 Iter begin() const {return m_begin;}
00119
00120 private:
00121 Iter m_begin;
00122 Iter m_end;
00123 Iter m_cur;
00124 Pred m_f;
00125
00126 void initialize( bool setend )
00127 {
00128 if( setend )
00129 m_cur = m_end;
00130 else
00131 assertPred();
00132 }
00133
00134 void copyMembers( const FilterIterator& x )
00135 {
00136 m_begin = x.begin();
00137 m_end = x.end();
00138 m_cur = x.cur();
00139 m_f = x.pred();
00140 }
00141
00142
00143 void assertPred( bool forward=true )
00144 {
00145 if( forward )
00146 while( m_cur!=m_end && !m_f(**m_cur) )
00147 ++m_cur;
00148 else
00149 while( m_cur!=m_begin && !m_f(**m_cur) )
00150 --m_cur;
00151 };
00152
00153 };
00154
00155 }
00156
00157 #endif