Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #ifndef LList_H
00037 #define LList_H
00038 
00039 #include <OpenFOAM/label.H>
00040 #include <OpenFOAM/uLabel.H>
00041 
00042 
00043 
00044 namespace Foam
00045 {
00046 
00047 class Istream;
00048 class Ostream;
00049 
00050 
00051 
00052 template<class LListBase, class T> class LList;
00053 
00054 template<class LListBase, class T>
00055 Istream& operator>>
00056 (
00057     Istream&,
00058     LList<LListBase, T>&
00059 );
00060 
00061 template<class LListBase, class T>
00062 Ostream& operator<<
00063 (
00064     Ostream&,
00065     const LList<LListBase, T>&
00066 );
00067 
00068 
00069 
00070 
00071 
00072 
00073 template<class LListBase, class T>
00074 class LList
00075 :
00076     public LListBase
00077 {
00078 
00079 public:
00080 
00081     
00082 
00083         class iterator;
00084         friend class iterator;
00085 
00086         class const_iterator;
00087         friend class const_iterator;
00088 
00089 
00090     
00091     struct link
00092     :
00093         public LListBase::link
00094     {
00095         
00096         T obj_;
00097 
00098         
00099         link(T a)
00100         :
00101             obj_(a)
00102         {}
00103     };
00104 
00105 
00106     
00107 
00108         
00109         LList()
00110         {}
00111 
00112         
00113         LList(T a)
00114         :
00115             LListBase(new link(a))
00116         {}
00117 
00118         
00119         LList(Istream&);
00120 
00121         
00122         LList(const LList<LListBase, T>&);
00123 
00124 
00125     
00126 
00127         ~LList();
00128 
00129 
00130     
00131 
00132         
00133 
00134             
00135             T& first()
00136             {
00137                 return static_cast<link*>(LListBase::first())->obj_;
00138             }
00139 
00140             
00141             const T& first() const
00142             {
00143                 return static_cast<const link*>(LListBase::first())->obj_;
00144             }
00145 
00146             
00147             T& last()
00148             {
00149                 return static_cast<link*>(LListBase::last())->obj_;
00150             }
00151 
00152             
00153             const T& last() const
00154             {
00155                 return static_cast<const link*>(LListBase::last())->obj_;
00156             }
00157 
00158 
00159         
00160 
00161             
00162             void insert(const T& a)
00163             {
00164                 LListBase::insert(new link(a));
00165             }
00166 
00167             
00168             void append(const T& a)
00169             {
00170                 LListBase::append(new link(a));
00171             }
00172 
00173             
00174             T removeHead()
00175             {
00176                 link* elmtPtr = static_cast<link*>(LListBase::removeHead());
00177                 T data = elmtPtr->obj_;
00178                 delete elmtPtr;
00179                 return data;
00180             }
00181 
00182             
00183             T remove(link* l)
00184             {
00185                 link* elmtPtr = static_cast<link*>(LListBase::remove(l));
00186                 T data = elmtPtr->obj_;
00187                 delete elmtPtr;
00188                 return data;
00189             }
00190 
00191             
00192             T remove(iterator& it)
00193             {
00194                 link* elmtPtr = static_cast<link*>(LListBase::remove(it));
00195                 T data = elmtPtr->obj_;
00196                 delete elmtPtr;
00197                 return data;
00198             }
00199 
00200             
00201             void clear();
00202 
00203             
00204             
00205             void transfer(LList<LListBase, T>&);
00206 
00207     
00208 
00209         void operator=(const LList<LListBase, T>&);
00210 
00211 
00212     
00213 
00214         
00215         typedef T value_type;
00216 
00217         
00218         
00219         typedef T& reference;
00220 
00221         
00222         
00223         typedef const T& const_reference;
00224 
00225         
00226         typedef label size_type;
00227 
00228 
00229     
00230 
00231         typedef typename LListBase::iterator LListBase_iterator;
00232 
00233         
00234         class iterator
00235         :
00236             public LListBase_iterator
00237         {
00238 
00239         public:
00240 
00241             
00242             iterator
00243             (
00244                 LListBase_iterator baseIter
00245             )
00246             :
00247                 LListBase_iterator(baseIter)
00248             {}
00249 
00250 
00251             
00252 
00253                 T& operator*()
00254                 {
00255                     return
00256                         static_cast<link&>
00257                         (LListBase_iterator::operator*()).obj_;
00258                 }
00259 
00260                 T& operator()()
00261                 {
00262                     return operator*();
00263                 }
00264 
00265                 iterator& operator++()
00266                 {
00267                     LListBase_iterator::operator++();
00268                     return *this;
00269                 }
00270         };
00271 
00272 
00273     
00274 
00275         typedef typename LListBase::const_iterator LListBase_const_iterator;
00276 
00277         
00278         class const_iterator
00279         :
00280             public LListBase_const_iterator
00281         {
00282 
00283         public:
00284 
00285             
00286             const_iterator
00287             (
00288                 LListBase_const_iterator baseIter
00289             )
00290             :
00291                 LListBase_const_iterator(baseIter)
00292             {}
00293 
00294 
00295             
00296             const_iterator
00297             (
00298                 LListBase_iterator baseIter
00299             )
00300             :
00301                 LListBase_const_iterator(baseIter)
00302             {}
00303 
00304 
00305             
00306 
00307                 const T& operator*()
00308                 {
00309                     return
00310                         static_cast<const link&>
00311                         (LListBase_const_iterator::operator*()).obj_;
00312                 }
00313 
00314                 const T& operator()()
00315                 {
00316                     return operator*();
00317                 }
00318 
00319                 const_iterator& operator++()
00320                 {
00321                     LListBase_const_iterator::operator++();
00322                     return *this;
00323                 }
00324         };
00325 
00326 
00327     
00328 
00329         friend Istream& operator>> <LListBase, T>
00330         (
00331             Istream&,
00332             LList<LListBase, T>&
00333         );
00334 
00335         friend Ostream& operator<< <LListBase, T>
00336         (
00337             Ostream&,
00338             const LList<LListBase, T>&
00339         );
00340 };
00341 
00342 
00343 
00344 
00345 } 
00346 
00347 
00348 
00349 #ifdef NoRepository
00350 #   include "LList.C"
00351 #endif
00352 
00353 
00354 
00355 #endif
00356 
00357