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