1*8a106958SDamjan Jovanovic /************************************************************** 2*8a106958SDamjan Jovanovic * 3*8a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 4*8a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 5*8a106958SDamjan Jovanovic * distributed with this work for additional information 6*8a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 7*8a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 8*8a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance 9*8a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at 10*8a106958SDamjan Jovanovic * 11*8a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 12*8a106958SDamjan Jovanovic * 13*8a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 14*8a106958SDamjan Jovanovic * software distributed under the License is distributed on an 15*8a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*8a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the 17*8a106958SDamjan Jovanovic * specific language governing permissions and limitations 18*8a106958SDamjan Jovanovic * under the License. 19*8a106958SDamjan Jovanovic * 20*8a106958SDamjan Jovanovic *************************************************************/ 21*8a106958SDamjan Jovanovic 22*8a106958SDamjan Jovanovic 23*8a106958SDamjan Jovanovic 24*8a106958SDamjan Jovanovic #ifndef CSV_SWELIST_HXX 25*8a106958SDamjan Jovanovic #define CSV_SWELIST_HXX 26*8a106958SDamjan Jovanovic 27*8a106958SDamjan Jovanovic // USED SERVICES 28*8a106958SDamjan Jovanovic // BASE CLASSES 29*8a106958SDamjan Jovanovic // COMPONENTS 30*8a106958SDamjan Jovanovic // PARAMETERS 31*8a106958SDamjan Jovanovic #include <cosv/tpl/dyn.hxx> 32*8a106958SDamjan Jovanovic 33*8a106958SDamjan Jovanovic 34*8a106958SDamjan Jovanovic namespace csv 35*8a106958SDamjan Jovanovic { 36*8a106958SDamjan Jovanovic 37*8a106958SDamjan Jovanovic 38*8a106958SDamjan Jovanovic template <class XX> 39*8a106958SDamjan Jovanovic class SweListElement 40*8a106958SDamjan Jovanovic { 41*8a106958SDamjan Jovanovic public: 42*8a106958SDamjan Jovanovic typedef SweListElement<XX> self; 43*8a106958SDamjan Jovanovic SweListElement(const XX & in_aObj)44*8a106958SDamjan Jovanovic SweListElement( 45*8a106958SDamjan Jovanovic const XX & in_aObj ) 46*8a106958SDamjan Jovanovic : aObj(in_aObj), pNext(0) {} 47*8a106958SDamjan Jovanovic Obj() const48*8a106958SDamjan Jovanovic const XX & Obj() const { return aObj; } Obj()49*8a106958SDamjan Jovanovic XX & Obj() { return aObj; } Next() const50*8a106958SDamjan Jovanovic self * Next() const { return pNext; } 51*8a106958SDamjan Jovanovic SetNext(self * i_pNext)52*8a106958SDamjan Jovanovic void SetNext( 53*8a106958SDamjan Jovanovic self * i_pNext ) 54*8a106958SDamjan Jovanovic { pNext = i_pNext; } 55*8a106958SDamjan Jovanovic private: 56*8a106958SDamjan Jovanovic XX aObj; 57*8a106958SDamjan Jovanovic self * pNext; 58*8a106958SDamjan Jovanovic }; 59*8a106958SDamjan Jovanovic 60*8a106958SDamjan Jovanovic 61*8a106958SDamjan Jovanovic 62*8a106958SDamjan Jovanovic template <class XX> class SweListIterator; 63*8a106958SDamjan Jovanovic template <class XX> class SweListCIterator; 64*8a106958SDamjan Jovanovic 65*8a106958SDamjan Jovanovic 66*8a106958SDamjan Jovanovic template <class XX> 67*8a106958SDamjan Jovanovic class SweList 68*8a106958SDamjan Jovanovic { 69*8a106958SDamjan Jovanovic public: 70*8a106958SDamjan Jovanovic // TYPES 71*8a106958SDamjan Jovanovic typedef SweList<XX> self; 72*8a106958SDamjan Jovanovic typedef XX value_type; 73*8a106958SDamjan Jovanovic typedef SweListIterator<XX> iterator; 74*8a106958SDamjan Jovanovic typedef SweListCIterator<XX> const_iterator; 75*8a106958SDamjan Jovanovic private: 76*8a106958SDamjan Jovanovic typedef SweListElement<XX> elem; 77*8a106958SDamjan Jovanovic 78*8a106958SDamjan Jovanovic public: 79*8a106958SDamjan Jovanovic // LIFECYCLE SweList()80*8a106958SDamjan Jovanovic SweList() : pTop(0), pTail(0) {} ~SweList()81*8a106958SDamjan Jovanovic ~SweList() { erase_all(); } 82*8a106958SDamjan Jovanovic // OPERATIONS 83*8a106958SDamjan Jovanovic void push_front( 84*8a106958SDamjan Jovanovic const XX & i_aObj ); 85*8a106958SDamjan Jovanovic void pop_front(); 86*8a106958SDamjan Jovanovic void push_back( 87*8a106958SDamjan Jovanovic const XX & i_aObj ); 88*8a106958SDamjan Jovanovic void erase_all(); 89*8a106958SDamjan Jovanovic 90*8a106958SDamjan Jovanovic // INQUIRY begin() const91*8a106958SDamjan Jovanovic const_iterator begin() const { return pTop; } begin()92*8a106958SDamjan Jovanovic iterator begin() { return pTop; } end() const93*8a106958SDamjan Jovanovic const_iterator end() const { return (elem*)0; } end()94*8a106958SDamjan Jovanovic iterator end() { return (elem*)0; } front() const95*8a106958SDamjan Jovanovic const XX & front() const { return pTop->Obj(); } front()96*8a106958SDamjan Jovanovic XX & front() { return pTop->Obj(); } back() const97*8a106958SDamjan Jovanovic const XX & back() const { return pTail->Obj(); } back()98*8a106958SDamjan Jovanovic XX & back() { return pTail->Obj(); } 99*8a106958SDamjan Jovanovic empty() const100*8a106958SDamjan Jovanovic bool empty() const { return pTop == 0; } 101*8a106958SDamjan Jovanovic uintt size() const; 102*8a106958SDamjan Jovanovic 103*8a106958SDamjan Jovanovic 104*8a106958SDamjan Jovanovic private: 105*8a106958SDamjan Jovanovic // Forbiddden methods. 106*8a106958SDamjan Jovanovic SweList( 107*8a106958SDamjan Jovanovic const self & i_rList ); 108*8a106958SDamjan Jovanovic self & operator=( 109*8a106958SDamjan Jovanovic const self & i_rList ); 110*8a106958SDamjan Jovanovic 111*8a106958SDamjan Jovanovic // DATA 112*8a106958SDamjan Jovanovic DYN elem * pTop; 113*8a106958SDamjan Jovanovic elem * pTail; 114*8a106958SDamjan Jovanovic }; 115*8a106958SDamjan Jovanovic 116*8a106958SDamjan Jovanovic template <class XX> 117*8a106958SDamjan Jovanovic class SweList_dyn 118*8a106958SDamjan Jovanovic { 119*8a106958SDamjan Jovanovic public: 120*8a106958SDamjan Jovanovic // TYPES 121*8a106958SDamjan Jovanovic typedef SweList_dyn<XX> self; 122*8a106958SDamjan Jovanovic typedef SweListElement< XX* > elem; 123*8a106958SDamjan Jovanovic typedef SweListIterator< XX* > iterator; 124*8a106958SDamjan Jovanovic 125*8a106958SDamjan Jovanovic // LIFECYCLE SweList_dyn()126*8a106958SDamjan Jovanovic SweList_dyn() : pTop(0), pTail(0) {} ~SweList_dyn()127*8a106958SDamjan Jovanovic ~SweList_dyn() { erase_all(); } 128*8a106958SDamjan Jovanovic // OPERATIONS 129*8a106958SDamjan Jovanovic void push_front( 130*8a106958SDamjan Jovanovic XX * i_pObj ); 131*8a106958SDamjan Jovanovic void push_back( 132*8a106958SDamjan Jovanovic XX * i_pObj ); 133*8a106958SDamjan Jovanovic void pop_front(); 134*8a106958SDamjan Jovanovic void erase_all(); 135*8a106958SDamjan Jovanovic 136*8a106958SDamjan Jovanovic // INQUIRY begin() const137*8a106958SDamjan Jovanovic iterator begin() const { return pTop; } end() const138*8a106958SDamjan Jovanovic iterator end() const { return (elem*)0; } front() const139*8a106958SDamjan Jovanovic XX * front() const { return pTop->Obj(); } back() const140*8a106958SDamjan Jovanovic XX * back() const { return pTail->Obj(); } 141*8a106958SDamjan Jovanovic empty() const142*8a106958SDamjan Jovanovic bool empty() const { return pTop == 0; } 143*8a106958SDamjan Jovanovic uintt size() const; 144*8a106958SDamjan Jovanovic 145*8a106958SDamjan Jovanovic private: 146*8a106958SDamjan Jovanovic // Forbiddden methods. 147*8a106958SDamjan Jovanovic SweList_dyn( 148*8a106958SDamjan Jovanovic const self & i_rList ); 149*8a106958SDamjan Jovanovic self & operator=( 150*8a106958SDamjan Jovanovic const self & i_rList ); 151*8a106958SDamjan Jovanovic 152*8a106958SDamjan Jovanovic DYN elem * pTop; 153*8a106958SDamjan Jovanovic elem * pTail; 154*8a106958SDamjan Jovanovic }; 155*8a106958SDamjan Jovanovic 156*8a106958SDamjan Jovanovic 157*8a106958SDamjan Jovanovic 158*8a106958SDamjan Jovanovic 159*8a106958SDamjan Jovanovic template<class XX> 160*8a106958SDamjan Jovanovic class SweListIterator 161*8a106958SDamjan Jovanovic { 162*8a106958SDamjan Jovanovic public: 163*8a106958SDamjan Jovanovic typedef SweListIterator<XX> self; 164*8a106958SDamjan Jovanovic typedef SweListElement<XX> elem; 165*8a106958SDamjan Jovanovic SweListIterator(elem * i_pElem=0)166*8a106958SDamjan Jovanovic SweListIterator( 167*8a106958SDamjan Jovanovic elem * i_pElem = 0) 168*8a106958SDamjan Jovanovic : pElem(i_pElem) { } 169*8a106958SDamjan Jovanovic 170*8a106958SDamjan Jovanovic // OPERATORS operator *() const171*8a106958SDamjan Jovanovic XX & operator*() const { return pElem->Obj(); } operator ++()172*8a106958SDamjan Jovanovic self & operator++() { if (pElem != 0) pElem = pElem->Next(); 173*8a106958SDamjan Jovanovic return *this; } operator ==(const self & i_rIter) const174*8a106958SDamjan Jovanovic bool operator==( 175*8a106958SDamjan Jovanovic const self & i_rIter ) const 176*8a106958SDamjan Jovanovic { return pElem == i_rIter.pElem; } operator !=(const self & i_rIter) const177*8a106958SDamjan Jovanovic bool operator!=( 178*8a106958SDamjan Jovanovic const self & i_rIter ) const 179*8a106958SDamjan Jovanovic { return pElem != i_rIter.pElem; } 180*8a106958SDamjan Jovanovic private: 181*8a106958SDamjan Jovanovic friend class SweListCIterator<XX>; 182*8a106958SDamjan Jovanovic 183*8a106958SDamjan Jovanovic elem * pElem; 184*8a106958SDamjan Jovanovic }; 185*8a106958SDamjan Jovanovic 186*8a106958SDamjan Jovanovic template<class XX> 187*8a106958SDamjan Jovanovic class SweListCIterator 188*8a106958SDamjan Jovanovic { 189*8a106958SDamjan Jovanovic public: 190*8a106958SDamjan Jovanovic typedef SweListCIterator<XX> self; 191*8a106958SDamjan Jovanovic typedef SweListElement<XX> elem; 192*8a106958SDamjan Jovanovic SweListCIterator(const elem * i_pElem=0)193*8a106958SDamjan Jovanovic SweListCIterator( 194*8a106958SDamjan Jovanovic const elem * i_pElem = 0) 195*8a106958SDamjan Jovanovic : pElem(i_pElem) { } 196*8a106958SDamjan Jovanovic 197*8a106958SDamjan Jovanovic // OPERATORS operator =(const SweListIterator<XX> & i_rIter)198*8a106958SDamjan Jovanovic self & operator=( 199*8a106958SDamjan Jovanovic const SweListIterator<XX> & 200*8a106958SDamjan Jovanovic i_rIter ) 201*8a106958SDamjan Jovanovic { pElem = i_rIter.pElem; return *this; } 202*8a106958SDamjan Jovanovic operator *() const203*8a106958SDamjan Jovanovic const XX & operator*() const { return pElem->Obj(); } operator ++()204*8a106958SDamjan Jovanovic self & operator++() { if (pElem != 0) pElem = pElem->Next(); 205*8a106958SDamjan Jovanovic return *this; } operator ==(const self & i_rIter) const206*8a106958SDamjan Jovanovic bool operator==( 207*8a106958SDamjan Jovanovic const self & i_rIter ) const 208*8a106958SDamjan Jovanovic { return pElem == i_rIter.pElem; } operator !=(const self & i_rIter) const209*8a106958SDamjan Jovanovic bool operator!=( 210*8a106958SDamjan Jovanovic const self & i_rIter ) const 211*8a106958SDamjan Jovanovic { return pElem != i_rIter.pElem; } 212*8a106958SDamjan Jovanovic private: 213*8a106958SDamjan Jovanovic const elem * pElem; 214*8a106958SDamjan Jovanovic }; 215*8a106958SDamjan Jovanovic 216*8a106958SDamjan Jovanovic // Implementierung 217*8a106958SDamjan Jovanovic 218*8a106958SDamjan Jovanovic template <class XX> 219*8a106958SDamjan Jovanovic void push_front(const XX & i_aObj)220*8a106958SDamjan JovanovicSweList<XX>::push_front( const XX & i_aObj ) 221*8a106958SDamjan Jovanovic { 222*8a106958SDamjan Jovanovic DYN elem * dpNew = new elem(i_aObj); 223*8a106958SDamjan Jovanovic dpNew->SetNext(pTop); 224*8a106958SDamjan Jovanovic pTop = dpNew; 225*8a106958SDamjan Jovanovic if (pTail == 0) 226*8a106958SDamjan Jovanovic pTail = pTop; 227*8a106958SDamjan Jovanovic } 228*8a106958SDamjan Jovanovic 229*8a106958SDamjan Jovanovic template <class XX> 230*8a106958SDamjan Jovanovic void push_back(const XX & i_aObj)231*8a106958SDamjan JovanovicSweList<XX>::push_back( const XX & i_aObj) 232*8a106958SDamjan Jovanovic { 233*8a106958SDamjan Jovanovic if (pTail != 0) 234*8a106958SDamjan Jovanovic { 235*8a106958SDamjan Jovanovic pTail->SetNext(new elem(i_aObj)); 236*8a106958SDamjan Jovanovic pTail = pTail->Next(); 237*8a106958SDamjan Jovanovic } 238*8a106958SDamjan Jovanovic else 239*8a106958SDamjan Jovanovic { 240*8a106958SDamjan Jovanovic pTop = pTail = new elem(i_aObj); 241*8a106958SDamjan Jovanovic } 242*8a106958SDamjan Jovanovic } 243*8a106958SDamjan Jovanovic 244*8a106958SDamjan Jovanovic template <class XX> 245*8a106958SDamjan Jovanovic void pop_front()246*8a106958SDamjan JovanovicSweList<XX>::pop_front() 247*8a106958SDamjan Jovanovic { 248*8a106958SDamjan Jovanovic if (pTop != 0) 249*8a106958SDamjan Jovanovic { 250*8a106958SDamjan Jovanovic elem * pDel = pTop; 251*8a106958SDamjan Jovanovic pTop = pTop->Next(); 252*8a106958SDamjan Jovanovic delete pDel; 253*8a106958SDamjan Jovanovic if (pTop == 0) 254*8a106958SDamjan Jovanovic pTail = 0; 255*8a106958SDamjan Jovanovic } 256*8a106958SDamjan Jovanovic } 257*8a106958SDamjan Jovanovic 258*8a106958SDamjan Jovanovic template <class XX> 259*8a106958SDamjan Jovanovic uintt size() const260*8a106958SDamjan JovanovicSweList<XX>::size() const 261*8a106958SDamjan Jovanovic { 262*8a106958SDamjan Jovanovic uintt ret = 0; 263*8a106958SDamjan Jovanovic for ( const_iterator iter = begin(); 264*8a106958SDamjan Jovanovic iter != end(); 265*8a106958SDamjan Jovanovic ++iter ) 266*8a106958SDamjan Jovanovic { 267*8a106958SDamjan Jovanovic ++ret; 268*8a106958SDamjan Jovanovic } 269*8a106958SDamjan Jovanovic return ret; 270*8a106958SDamjan Jovanovic } 271*8a106958SDamjan Jovanovic 272*8a106958SDamjan Jovanovic 273*8a106958SDamjan Jovanovic template <class XX> 274*8a106958SDamjan Jovanovic void erase_all()275*8a106958SDamjan JovanovicSweList<XX>::erase_all() 276*8a106958SDamjan Jovanovic { 277*8a106958SDamjan Jovanovic for (pTail = pTop ; pTop != 0; pTail = pTop) 278*8a106958SDamjan Jovanovic { 279*8a106958SDamjan Jovanovic pTop = pTop->Next(); 280*8a106958SDamjan Jovanovic delete pTail; 281*8a106958SDamjan Jovanovic } 282*8a106958SDamjan Jovanovic pTop = pTail = 0; 283*8a106958SDamjan Jovanovic } 284*8a106958SDamjan Jovanovic 285*8a106958SDamjan Jovanovic 286*8a106958SDamjan Jovanovic template <class XX> 287*8a106958SDamjan Jovanovic void push_front(XX * i_pObj)288*8a106958SDamjan JovanovicSweList_dyn<XX>::push_front( XX * i_pObj ) 289*8a106958SDamjan Jovanovic { 290*8a106958SDamjan Jovanovic DYN elem * dpNew = new elem(i_pObj); 291*8a106958SDamjan Jovanovic dpNew->SetNext(pTop); 292*8a106958SDamjan Jovanovic pTop = dpNew; 293*8a106958SDamjan Jovanovic if (pTail == 0) 294*8a106958SDamjan Jovanovic pTail = pTop; 295*8a106958SDamjan Jovanovic } 296*8a106958SDamjan Jovanovic 297*8a106958SDamjan Jovanovic template <class XX> 298*8a106958SDamjan Jovanovic void push_back(XX * i_pObj)299*8a106958SDamjan JovanovicSweList_dyn<XX>::push_back( XX * i_pObj ) 300*8a106958SDamjan Jovanovic { 301*8a106958SDamjan Jovanovic if (pTail != 0) 302*8a106958SDamjan Jovanovic { 303*8a106958SDamjan Jovanovic pTail->SetNext(new elem(i_pObj)); 304*8a106958SDamjan Jovanovic pTail = pTail->Next(); 305*8a106958SDamjan Jovanovic } 306*8a106958SDamjan Jovanovic else 307*8a106958SDamjan Jovanovic { 308*8a106958SDamjan Jovanovic pTop = pTail = new elem(i_pObj); 309*8a106958SDamjan Jovanovic } 310*8a106958SDamjan Jovanovic } 311*8a106958SDamjan Jovanovic 312*8a106958SDamjan Jovanovic template <class XX> 313*8a106958SDamjan Jovanovic void pop_front()314*8a106958SDamjan JovanovicSweList_dyn<XX>::pop_front() 315*8a106958SDamjan Jovanovic { 316*8a106958SDamjan Jovanovic if (pTop != 0) 317*8a106958SDamjan Jovanovic { 318*8a106958SDamjan Jovanovic elem * pDel = pTop; 319*8a106958SDamjan Jovanovic pTop = pTop->Next(); 320*8a106958SDamjan Jovanovic if (pDel->Obj() != 0) 321*8a106958SDamjan Jovanovic Delete_dyn(pDel->Obj()); 322*8a106958SDamjan Jovanovic delete pDel; 323*8a106958SDamjan Jovanovic if (pTop == 0) 324*8a106958SDamjan Jovanovic pTail = 0; 325*8a106958SDamjan Jovanovic } 326*8a106958SDamjan Jovanovic } 327*8a106958SDamjan Jovanovic 328*8a106958SDamjan Jovanovic 329*8a106958SDamjan Jovanovic template <class XX> 330*8a106958SDamjan Jovanovic void erase_all()331*8a106958SDamjan JovanovicSweList_dyn<XX>::erase_all() 332*8a106958SDamjan Jovanovic { 333*8a106958SDamjan Jovanovic for (pTail = pTop ; pTop != 0; pTail = pTop) 334*8a106958SDamjan Jovanovic { 335*8a106958SDamjan Jovanovic pTop = pTop->Next(); 336*8a106958SDamjan Jovanovic if (pTail->Obj() != 0) 337*8a106958SDamjan Jovanovic { 338*8a106958SDamjan Jovanovic delete pTail->Obj(); 339*8a106958SDamjan Jovanovic } 340*8a106958SDamjan Jovanovic delete pTail; 341*8a106958SDamjan Jovanovic } 342*8a106958SDamjan Jovanovic pTop = pTail = 0; 343*8a106958SDamjan Jovanovic } 344*8a106958SDamjan Jovanovic 345*8a106958SDamjan Jovanovic template <class XX> 346*8a106958SDamjan Jovanovic uintt size() const347*8a106958SDamjan JovanovicSweList_dyn<XX>::size() const 348*8a106958SDamjan Jovanovic { 349*8a106958SDamjan Jovanovic uintt ret = 0; 350*8a106958SDamjan Jovanovic for ( iterator iter = begin(); 351*8a106958SDamjan Jovanovic iter != end(); 352*8a106958SDamjan Jovanovic ++iter ) 353*8a106958SDamjan Jovanovic { 354*8a106958SDamjan Jovanovic ++ret; 355*8a106958SDamjan Jovanovic } 356*8a106958SDamjan Jovanovic return ret; 357*8a106958SDamjan Jovanovic } 358*8a106958SDamjan Jovanovic 359*8a106958SDamjan Jovanovic 360*8a106958SDamjan Jovanovic } // namespace csv 361*8a106958SDamjan Jovanovic 362*8a106958SDamjan Jovanovic 363*8a106958SDamjan Jovanovic #endif 364