00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LIST_LIST_ITERATOR_H
00024 #define LIST_LIST_ITERATOR_H
00025
00026 #include "y2storage/AppUtil.h"
00027 #include "y2storage/IterPair.h"
00028
00029 namespace storage
00030 {
00031
00032 template< class PIter, class Iter >
00033 class ListListIterator : public PIter
00034 {
00035 public:
00036 typedef typename PIter::value_type value_type;
00037 typedef typename PIter::reference reference;
00038 typedef typename PIter::pointer pointer;
00039 typedef typename PIter::difference_type difference_type;
00040 typedef typename PIter::iterator_category iterator_category;
00041
00042 ListListIterator() { }
00043
00044 ListListIterator( const Iter& begin, const Iter& end, bool setend=false ) :
00045 m_lcur(begin)
00046 {
00047 initialize( begin, end, setend );
00048 }
00049
00050 ListListIterator( const IterPair<Iter>& p, bool setend=false ) :
00051 m_lcur(p.begin())
00052 {
00053 initialize( p.begin(), p.end(), setend );
00054 }
00055
00056 ListListIterator( const ListListIterator& x )
00057 {
00058 copyMembers( x );
00059 }
00060
00061 ListListIterator& operator=(const ListListIterator& x)
00062 {
00063 copyMembers( x );
00064 return *this;
00065 }
00066
00067 ListListIterator& operator++()
00068 {
00069 increment();
00070 return *this;
00071 }
00072 ListListIterator operator++(int)
00073 {
00074 y2war( "Expensive ++ ListListIterator" );
00075 ListListIterator tmp(*this);
00076 increment();
00077 return tmp;
00078 }
00079
00080 ListListIterator& operator--()
00081 {
00082 decrement();
00083 return *this;
00084 }
00085 ListListIterator operator--(int)
00086 {
00087 y2war( "Expensive -- ListListIterator" );
00088 ListListIterator tmp(*this);
00089 decrement();
00090 return tmp;
00091 }
00092
00093 reference operator*() const
00094 {
00095 return( *m_pcur );
00096 }
00097
00098 pointer operator->() const
00099 {
00100 return( &(*m_pcur) );
00101 }
00102 bool operator==(const ListListIterator& x) const
00103 {
00104 return( m_pcur == x.pcur() );
00105 }
00106 bool operator!=(const ListListIterator& x) const
00107 {
00108 return( m_pcur != x.pcur() );
00109 }
00110
00111 PIter end() const {return m_end;}
00112 PIter begin() const {return m_begin;}
00113 PIter pcur() const {return m_pcur;}
00114 Iter cur() const {return m_lcur;}
00115
00116 private:
00117 PIter m_begin;
00118 PIter m_end;
00119 Iter m_lcur;
00120 PIter m_pcur;
00121 static const PIter empty;
00122
00123 void copyMembers( const ListListIterator& x )
00124 {
00125 m_begin = x.begin();
00126 m_end = x.end();
00127 m_lcur = x.cur();
00128 m_pcur = x.pcur();
00129 }
00130
00131 void increment()
00132 {
00133 if( m_pcur != m_end )
00134 {
00135 ++m_pcur;
00136 while( m_pcur!=m_end && m_pcur == m_lcur->end() )
00137 {
00138 ++m_lcur;
00139 m_pcur = m_lcur->begin();
00140 }
00141 }
00142 };
00143
00144 void decrement()
00145 {
00146 if( m_pcur != m_begin )
00147 {
00148 if( m_pcur != m_lcur->begin() )
00149 {
00150 --m_pcur;
00151 }
00152 else
00153 {
00154 do
00155 {
00156 --m_lcur;
00157 m_pcur = --(m_lcur->end());
00158 }
00159 while( m_pcur!=m_begin &&
00160 m_lcur->begin()==m_lcur->end() );
00161 }
00162 }
00163 };
00164
00165 void initialize( const Iter& begin, const Iter& end, bool setend )
00166 {
00167 m_begin = m_end = m_pcur = empty;
00168 while( m_lcur != end && m_lcur->begin()==m_lcur->end() )
00169 {
00170 ++m_lcur;
00171 }
00172 if( m_lcur != end )
00173 m_begin = m_lcur->begin();
00174 if( begin != end )
00175 {
00176 Iter tmp = end;
00177 --tmp;
00178 while( tmp != begin && tmp->begin()==tmp->end() )
00179 {
00180 --tmp;
00181 }
00182 if( tmp != begin || begin->begin()!=begin->end())
00183 {
00184 m_end = tmp->end();
00185 }
00186 if( setend )
00187 {
00188 m_pcur = m_end;
00189 m_lcur = tmp;
00190 }
00191 else
00192 m_pcur = m_begin;
00193 }
00194 }
00195
00196 };
00197
00198 template< typename PIter, typename Iter > const PIter ListListIterator<PIter,Iter>::empty = PIter();
00199
00200 }
00201
00202 #endif