Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

ListListIterator.h

Go to the documentation of this file.
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

Generated on Wed Sep 14 11:27:07 2005 for yast2-storage by  doxygen 1.4.4