00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _LIST_H_
00012 #define _LIST_H_
00013
00014 #include "MayDay.H"
00015 #include "Pool.H"
00016
00017 #include "BaseNamespaceHeader.H"
00018
00019 template <class T> class ListLink;
00020 template <class T> class ListIterator;
00021 template <class T> class List;
00022
00023
00024 #ifndef DOXYGEN
00025
00026
00027 template <class T>
00028 class ListLink
00029 {
00030 private:
00031 friend class List<T>;
00032 friend class ListIterator<T>;
00033
00034 ListLink (const T& _val,
00035 ListLink<T>* _pre,
00036 ListLink<T>* _suc)
00037 :
00038 val(_val),
00039 pre(_pre),
00040 suc(_suc)
00041 {}
00042
00043 void swap(ListLink<T>* a);
00044
00045 T val;
00046 ListLink<T>* pre;
00047 ListLink<T>* suc;
00048 };
00049
00050 #endif // doxygen
00051
00053
00057 template <class T>
00058 class ListIterator
00059 {
00060 public:
00061
00063 inline ListIterator (const List<T>& aList);
00064
00066 inline ListIterator (const ListIterator<T>& rhs);
00067
00069 inline void rewind ();
00070
00072
00075 inline void begin();
00076
00078 inline const T& operator() () const;
00079
00080 inline T& operator() () ;
00081
00083 inline const T& operator* () const;
00084
00086
00092 inline operator bool () const;
00093
00095
00098 inline bool ok() const ;
00099
00101 inline bool operator! () const;
00102
00104 inline const T& value () const;
00105
00107 const T& value ();
00108
00110
00115 inline ListIterator<T>& operator++ ();
00116
00118
00123 inline ListIterator<T>& operator-- ();
00124
00126
00131 inline ListIterator<T> operator-- (int);
00132
00134
00139 inline ListIterator<T> operator++ (int);
00140
00142
00146 inline bool operator== (const ListIterator<T>&) const;
00147
00149 inline bool operator!= (const ListIterator<T>&) const;
00150
00151 protected:
00152
00156 inline ListIterator (const List<T>& _list,
00157 ListLink<T>* _p);
00158
00162 const List<T>& list;
00163
00167 ListLink<T>* p;
00168
00169 private:
00170 friend class List<T>;
00171
00172
00173
00174 ListIterator ();
00175 ListIterator<T>& operator= (const ListIterator<T>&);
00176 };
00177
00179
00208 template <class T>
00209 class List
00210 {
00211 public:
00212
00214 inline List ();
00215
00216 inline List (bool usePool);
00217
00219 List (const List<T>& rhs);
00220
00222 List<T>& operator= (const List<T>& rhs);
00223
00225 inline ~List();
00226
00228 inline void prepend (const T& value);
00229
00231 inline void append (const T& value);
00232
00234 void add (const T& value);
00235
00237 void join (const List<T>& src);
00238
00240
00246 void catenate (List<T>& src);
00247
00249 void clear ();
00250
00252
00256 inline List<T>* copy () const;
00257
00259 inline T& firstElement () const;
00260
00262 inline T& lastElement () const;
00263
00265
00268 bool includes (const T& value) const;
00269
00271
00276 bool operator== (const List<T>& rhs) const;
00277
00279 bool operator!= (const List<T>& rhs) const;
00280
00282 inline bool isEmpty () const;
00283
00285 inline bool isNotEmpty () const;
00286
00288 int length () const;
00289
00291 inline void removeFirst ();
00292
00294 inline void removeLast ();
00295
00297 inline const T& operator[] (const ListIterator<T>& li) const;
00298
00300 inline T& operator[] (const ListIterator<T>& li);
00301
00303 void remove (const T& value);
00304
00306 void remove (const List<T>& lst);
00307
00309 void remove (ListIterator<T>& lit);
00310
00312 void transfer(ListIterator<T>& lit);
00313
00315 inline void replace (ListIterator<T>& li,
00316 const T& val);
00317
00319 inline void addAfter (ListIterator<T>& lit,
00320 const T& val);
00321
00323 inline void addBefore (ListIterator<T>& lit,
00324 const T& val);
00325
00327 inline ListIterator<T> listIterator () const;
00328
00330 inline ListIterator<T> first () const;
00331
00333 inline ListIterator<T> last () const;
00334
00336 void sort();
00337
00338 void checkLinks() const;
00339 protected:
00340
00344 void remove (ListLink<T> *ln);
00345
00346 void removeLink(ListLink<T> *ln);
00347
00351 ListLink<T>* addBefore (ListLink<T>* ln,
00352 const T& val);
00353
00357 ListLink<T>* addAfter (ListLink<T>* ln,
00358 const T& val);
00359
00363 ListLink<T>* head;
00364
00368 ListLink<T>* tail;
00369
00373 friend class ListIterator<T>;
00374
00379 static Pool linkPool;
00380
00381 bool m_usePool;
00382 };
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392 template <class T>
00393 inline
00394 ListIterator<T>::ListIterator (const List<T>& _list,
00395 ListLink<T>* _p)
00396 :
00397 list(_list),
00398 p(_p)
00399 {}
00400
00401 template <class T>
00402 inline
00403 ListIterator<T>::ListIterator (const List<T>& aList)
00404 : list(aList)
00405 {
00406 p = list.head;
00407 }
00408
00409 template <class T>
00410 inline
00411 ListIterator<T>::ListIterator (const ListIterator<T>& li)
00412 :
00413 list(li.list),
00414 p(li.p)
00415 {}
00416
00417 template <class T>
00418 inline
00419 void
00420 ListIterator<T>::rewind ()
00421 {
00422 p = list.head;
00423 }
00424
00425 template <class T>
00426 inline
00427 void
00428 ListIterator<T>::begin ()
00429 {
00430 p = list.head;
00431 }
00432
00433 template <class T>
00434 inline
00435 const T&
00436 ListIterator<T>::operator() () const
00437 {
00438 CH_assert(p != 0);
00439 return p->val;
00440 }
00441
00442 template <class T>
00443 inline
00444 T&
00445 ListIterator<T>::operator() ()
00446 {
00447 CH_assert(p != 0);
00448 return p->val;
00449 }
00450
00451 template <class T>
00452 inline
00453 const T&
00454 ListIterator<T>::operator* () const
00455 {
00456 CH_assert(p != 0);
00457 return p->val;
00458 }
00459
00460 template <class T>
00461 inline
00462 bool
00463 ListIterator<T>::ok() const
00464 {
00465 return p != 0 ? true : false;
00466 }
00467
00468 template <class T>
00469 inline
00470 ListIterator<T>::operator bool () const
00471 {
00472 return ok() ;
00473 }
00474
00475 template <class T>
00476 inline
00477 bool
00478 ListIterator<T>::operator! () const
00479 {
00480 return p == 0 ? true : false;
00481 }
00482
00483 template <class T>
00484 inline
00485 const T&
00486 ListIterator<T>::value () const
00487 {
00488 CH_assert(p != 0);
00489 return p->val;
00490 }
00491
00492 template <class T>
00493 inline
00494 ListIterator<T>&
00495 ListIterator<T>::operator++ ()
00496 {
00497 if (p)
00498 p = p->suc;
00499 return *this;
00500 }
00501
00502 template <class T>
00503 inline
00504 ListIterator<T>&
00505 ListIterator<T>::operator-- ()
00506 {
00507 if (p)
00508 p = p->pre;
00509 return *this;
00510 }
00511
00512 template <class T>
00513 inline
00514 ListIterator<T>
00515 ListIterator<T>::operator++ (int)
00516 {
00517 const ListIterator<T> li = *this;
00518 ++(*this);
00519 return li;
00520 }
00521
00522 template <class T>
00523 inline
00524 ListIterator<T>
00525 ListIterator<T>::operator-- (int)
00526 {
00527 const ListIterator<T> li = *this;
00528 --(*this);
00529 return li;
00530 }
00531
00532 template <class T>
00533 inline
00534 bool
00535 ListIterator<T>::operator== (const ListIterator<T>& _li) const
00536 {
00537 return (&list == &_li.list && p == _li.p) ? true : false;
00538 }
00539
00540 template <class T>
00541 inline
00542 bool
00543 ListIterator<T>::operator!= (const ListIterator<T>& _li) const
00544 {
00545 return ! ListIterator<T>::operator==(_li);
00546 }
00547
00548
00549
00550
00551
00552 template <class T>
00553 inline
00554 List<T>::List ()
00555 :
00556 head(0),
00557 tail(0),
00558 m_usePool(true)
00559 {}
00560
00561 template <class T>
00562 inline
00563 List<T>::~List ()
00564 {
00565 clear();
00566 }
00567
00568 template <class T>
00569 inline
00570 void
00571 List<T>::prepend (const T& value)
00572 {
00573 addBefore(head, value);
00574 }
00575
00576 template <class T>
00577 inline
00578 void
00579 List<T>::append (const T& value)
00580 {
00581 addAfter(tail, value);
00582 }
00583
00584
00585 template <class T>
00586 inline
00587 List<T>*
00588 List<T>::copy () const
00589 {
00590 List<T>* newlist = new List<T>(*this);
00591 if (newlist == 0)
00592 MayDay::Error("Out of memory in List::copy ");
00593 return newlist;
00594 }
00595
00596 template <class T>
00597 inline
00598 T&
00599 List<T>::firstElement () const
00600 {
00601 CH_assert(head != 0);
00602 return head->val;
00603 }
00604
00605 template <class T>
00606 inline
00607 T&
00608 List<T>::lastElement () const
00609 {
00610 CH_assert(tail != 0);
00611 return tail->val;
00612 }
00613
00614 template <class T>
00615 inline
00616 bool
00617 List<T>::isEmpty () const
00618 {
00619 return head == 0 && tail == 0;
00620 }
00621
00622 template <class T>
00623 inline
00624 bool
00625 List<T>::isNotEmpty () const
00626 {
00627 return !isEmpty();
00628 }
00629
00630 template <class T>
00631 inline
00632 void
00633 List<T>::removeFirst ()
00634 {
00635 remove(head);
00636 }
00637
00638 template <class T>
00639 inline
00640 void
00641 List<T>::removeLast ()
00642 {
00643 remove(tail);
00644 }
00645
00646 template <class T>
00647 inline
00648 const T&
00649 List<T>::operator[] (const ListIterator<T>& li) const
00650 {
00651 CH_assert(li.p != 0);
00652 return li.p->val;
00653 }
00654
00655 template <class T>
00656 inline
00657 T&
00658 List<T>::operator[] (const ListIterator<T>& li)
00659 {
00660 CH_assert(li.p != 0);
00661 return li.p->val;
00662 }
00663
00664 template <class T>
00665 inline
00666 void
00667 List<T>::replace (ListIterator<T>& li,
00668 const T& _val)
00669 {
00670 CH_assert(li.p != 0);
00671 li.p->val = _val;
00672 }
00673
00674 template <class T>
00675 inline
00676 void
00677 List<T>::addAfter (ListIterator<T>& lit,
00678 const T& val)
00679 {
00680 addAfter(lit.p, val);
00681 }
00682
00683 template <class T>
00684 inline
00685 void
00686 List<T>::addBefore (ListIterator<T>& lit,
00687 const T& val)
00688 {
00689 addBefore(lit.p, val);
00690 }
00691
00692 template <class T>
00693 inline
00694 ListIterator<T>
00695 List<T>::first () const
00696 {
00697 return ListIterator<T>(*this,head);
00698 }
00699
00700 template <class T>
00701 inline
00702 ListIterator<T>
00703 List<T>::listIterator () const
00704 {
00705 return ListIterator<T>(*this,head);
00706 }
00707
00708 template <class T>
00709 inline
00710 ListIterator<T>
00711 List<T>::last () const
00712 {
00713 return ListIterator<T>(*this,tail);
00714 }
00715
00716 #include "BaseNamespaceFooter.H"
00717
00718 #include "ListImplem.H"
00719
00720 #endif