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
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifndef _LIST_H_
00053 #define _LIST_H_
00054
00055 #include "MayDay.H"
00056 #include "Pool.H"
00057
00058 template <class T> class ListLink;
00059 template <class T> class ListIterator;
00060 template <class T> class List;
00061
00062
00063 #ifndef DOXYGEN
00064
00065
00066 template <class T>
00067 class ListLink
00068 {
00069 private:
00070 friend class List<T>;
00071 friend class ListIterator<T>;
00072
00073 ListLink (const T& _val,
00074 ListLink<T>* _pre,
00075 ListLink<T>* _suc)
00076 :
00077 val(_val),
00078 pre(_pre),
00079 suc(_suc)
00080 {}
00081
00082 private:
00083 T val;
00084 ListLink<T>* pre;
00085 ListLink<T>* suc;
00086 };
00087
00088 #endif // doxygen
00089
00091
00095 template <class T>
00096 class ListIterator
00097 {
00098 public:
00099
00101 inline ListIterator (const List<T>& aList);
00102
00104 inline ListIterator (const ListIterator<T>& rhs);
00105
00107 inline void rewind ();
00108
00110
00113 inline void begin();
00114
00116 inline const T& operator() () const;
00117
00118 inline T& operator() () ;
00119
00121 inline const T& operator* () const;
00122
00124
00130 inline operator bool () const;
00131
00133
00136 inline bool ok() const ;
00137
00139 inline bool operator! () const;
00140
00142 inline const T& value () const;
00143
00145 const T& value ();
00146
00148
00153 inline ListIterator<T>& operator++ ();
00154
00156
00161 inline ListIterator<T>& operator-- ();
00162
00164
00169 inline ListIterator<T> operator-- (int);
00170
00172
00177 inline ListIterator<T> operator++ (int);
00178
00180
00184 inline bool operator== (const ListIterator<T>&) const;
00185
00187 inline bool operator!= (const ListIterator<T>&) const;
00188
00189 protected:
00190
00194 inline ListIterator (const List<T>& _list,
00195 ListLink<T>* _p);
00196
00200 const List<T>& list;
00201
00205 ListLink<T>* p;
00206
00207 private:
00208 friend class List<T>;
00209
00210
00211
00212 ListIterator ();
00213 ListIterator<T>& operator= (const ListIterator<T>&);
00214 };
00215
00217
00246 template <class T>
00247 class List
00248 {
00249 public:
00250
00252 inline List ();
00253
00255 List (const List<T>& rhs);
00256
00258 List<T>& operator= (const List<T>& rhs);
00259
00261 inline ~List();
00262
00264 inline void prepend (const T& value);
00265
00267 inline void append (const T& value);
00268
00270 void add (const T& value);
00271
00273 void join (const List<T>& src);
00274
00276
00282 void catenate (List<T>& src);
00283
00285 void clear ();
00286
00288
00292 inline List<T>* copy () const;
00293
00295 inline T& firstElement () const;
00296
00298 inline T& lastElement () const;
00299
00301
00304 bool includes (const T& value) const;
00305
00307
00312 bool operator== (const List<T>& rhs) const;
00313
00315 bool operator!= (const List<T>& rhs) const;
00316
00318 inline bool isEmpty () const;
00319
00321 inline bool isNotEmpty () const;
00322
00324 int length () const;
00325
00327 inline void removeFirst ();
00328
00330 inline void removeLast ();
00331
00333 inline const T& operator[] (const ListIterator<T>& li) const;
00334
00336 inline T& operator[] (const ListIterator<T>& li);
00337
00339 void remove (const T& value);
00340
00342 void remove (const List<T>& lst);
00343
00345 void remove (ListIterator<T>& lit);
00346
00348 void transfer(ListIterator<T>& lit);
00349
00351 inline void replace (ListIterator<T>& li,
00352 const T& val);
00353
00355 inline void addAfter (ListIterator<T>& lit,
00356 const T& val);
00357
00359 inline void addBefore (ListIterator<T>& lit,
00360 const T& val);
00361
00363 inline ListIterator<T> listIterator () const;
00364
00366 inline ListIterator<T> first () const;
00367
00369 inline ListIterator<T> last () const;
00370
00371 protected:
00372
00376 void remove (ListLink<T> *ln);
00377
00378 void removeLink(ListLink<T> *ln);
00379
00383 ListLink<T>* addBefore (ListLink<T>* ln,
00384 const T& val);
00385
00389 ListLink<T>* addAfter (ListLink<T>* ln,
00390 const T& val);
00391
00395 ListLink<T>* head;
00396
00400 ListLink<T>* tail;
00401
00405 friend class ListIterator<T>;
00406
00411 static Pool linkPool;
00412 };
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 template <class T>
00423 inline
00424 ListIterator<T>::ListIterator (const List<T>& _list,
00425 ListLink<T>* _p)
00426 :
00427 list(_list),
00428 p(_p)
00429 {}
00430
00431 template <class T>
00432 inline
00433 ListIterator<T>::ListIterator (const List<T>& aList)
00434 : list(aList)
00435 {
00436 p = list.head;
00437 }
00438
00439 template <class T>
00440 inline
00441 ListIterator<T>::ListIterator (const ListIterator<T>& li)
00442 :
00443 list(li.list),
00444 p(li.p)
00445 {}
00446
00447 template <class T>
00448 inline
00449 void
00450 ListIterator<T>::rewind ()
00451 {
00452 p = list.head;
00453 }
00454
00455 template <class T>
00456 inline
00457 void
00458 ListIterator<T>::begin ()
00459 {
00460 p = list.head;
00461 }
00462
00463 template <class T>
00464 inline
00465 const T&
00466 ListIterator<T>::operator() () const
00467 {
00468 CH_assert(p != 0);
00469 return p->val;
00470 }
00471
00472 template <class T>
00473 inline
00474 T&
00475 ListIterator<T>::operator() ()
00476 {
00477 CH_assert(p != 0);
00478 return p->val;
00479 }
00480
00481 template <class T>
00482 inline
00483 const T&
00484 ListIterator<T>::operator* () const
00485 {
00486 CH_assert(p != 0);
00487 return p->val;
00488 }
00489
00490 template <class T>
00491 inline
00492 bool
00493 ListIterator<T>::ok() const
00494 {
00495 return p != 0 ? true : false;
00496 }
00497
00498 template <class T>
00499 inline
00500 ListIterator<T>::operator bool () const
00501 {
00502 return ok() ;
00503 }
00504
00505 template <class T>
00506 inline
00507 bool
00508 ListIterator<T>::operator! () const
00509 {
00510 return p == 0 ? true : false;
00511 }
00512
00513 template <class T>
00514 inline
00515 const T&
00516 ListIterator<T>::value () const
00517 {
00518 CH_assert(p != 0);
00519 return p->val;
00520 }
00521
00522 template <class T>
00523 inline
00524 ListIterator<T>&
00525 ListIterator<T>::operator++ ()
00526 {
00527 if (p)
00528 p = p->suc;
00529 return *this;
00530 }
00531
00532 template <class T>
00533 inline
00534 ListIterator<T>&
00535 ListIterator<T>::operator-- ()
00536 {
00537 if (p)
00538 p = p->pre;
00539 return *this;
00540 }
00541
00542 template <class T>
00543 inline
00544 ListIterator<T>
00545 ListIterator<T>::operator++ (int)
00546 {
00547 const ListIterator<T> li = *this;
00548 ++(*this);
00549 return li;
00550 }
00551
00552 template <class T>
00553 inline
00554 ListIterator<T>
00555 ListIterator<T>::operator-- (int)
00556 {
00557 const ListIterator<T> li = *this;
00558 --(*this);
00559 return li;
00560 }
00561
00562 template <class T>
00563 inline
00564 bool
00565 ListIterator<T>::operator== (const ListIterator<T>& _li) const
00566 {
00567 return (&list == &_li.list && p == _li.p) ? true : false;
00568 }
00569
00570 template <class T>
00571 inline
00572 bool
00573 ListIterator<T>::operator!= (const ListIterator<T>& _li) const
00574 {
00575 return ! ListIterator<T>::operator==(_li);
00576 }
00577
00578
00579
00580
00581
00582 template <class T>
00583 inline
00584 List<T>::List ()
00585 :
00586 head(0),
00587 tail(0)
00588 {}
00589
00590 template <class T>
00591 inline
00592 List<T>::~List ()
00593 {
00594 clear();
00595 }
00596
00597 template <class T>
00598 inline
00599 void
00600 List<T>::prepend (const T& value)
00601 {
00602 addBefore(head, value);
00603 }
00604
00605 template <class T>
00606 inline
00607 void
00608 List<T>::append (const T& value)
00609 {
00610 addAfter(tail, value);
00611 }
00612
00613 template <class T>
00614 inline
00615 List<T>*
00616 List<T>::copy () const
00617 {
00618 List<T>* newlist = new List<T>(*this);
00619 if (newlist == 0)
00620 MayDay::Error("Out of memory in List::copy ");
00621 return newlist;
00622 }
00623
00624 template <class T>
00625 inline
00626 T&
00627 List<T>::firstElement () const
00628 {
00629 CH_assert(head != 0);
00630 return head->val;
00631 }
00632
00633 template <class T>
00634 inline
00635 T&
00636 List<T>::lastElement () const
00637 {
00638 CH_assert(tail != 0);
00639 return tail->val;
00640 }
00641
00642 template <class T>
00643 inline
00644 bool
00645 List<T>::isEmpty () const
00646 {
00647 return head == 0 && tail == 0;
00648 }
00649
00650 template <class T>
00651 inline
00652 bool
00653 List<T>::isNotEmpty () const
00654 {
00655 return !isEmpty();
00656 }
00657
00658 template <class T>
00659 inline
00660 void
00661 List<T>::removeFirst ()
00662 {
00663 remove(head);
00664 }
00665
00666 template <class T>
00667 inline
00668 void
00669 List<T>::removeLast ()
00670 {
00671 remove(tail);
00672 }
00673
00674 template <class T>
00675 inline
00676 const T&
00677 List<T>::operator[] (const ListIterator<T>& li) const
00678 {
00679 CH_assert(li.p != 0);
00680 return li.p->val;
00681 }
00682
00683 template <class T>
00684 inline
00685 T&
00686 List<T>::operator[] (const ListIterator<T>& li)
00687 {
00688 CH_assert(li.p != 0);
00689 return li.p->val;
00690 }
00691
00692 template <class T>
00693 inline
00694 void
00695 List<T>::replace (ListIterator<T>& li,
00696 const T& _val)
00697 {
00698 CH_assert(li.p != 0);
00699 li.p->val = _val;
00700 }
00701
00702 template <class T>
00703 inline
00704 void
00705 List<T>::addAfter (ListIterator<T>& lit,
00706 const T& val)
00707 {
00708 addAfter(lit.p, val);
00709 }
00710
00711 template <class T>
00712 inline
00713 void
00714 List<T>::addBefore (ListIterator<T>& lit,
00715 const T& val)
00716 {
00717 addBefore(lit.p, val);
00718 }
00719
00720 template <class T>
00721 inline
00722 ListIterator<T>
00723 List<T>::first () const
00724 {
00725 return ListIterator<T>(*this,head);
00726 }
00727
00728 template <class T>
00729 inline
00730 ListIterator<T>
00731 List<T>::listIterator () const
00732 {
00733 return ListIterator<T>(*this,head);
00734 }
00735
00736 template <class T>
00737 inline
00738 ListIterator<T>
00739 List<T>::last () const
00740 {
00741 return ListIterator<T>(*this,tail);
00742 }
00743
00744 #include "ListImplem.H"
00745
00746 #endif