00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef TBCI_LIST_H
00017 #define TBCI_LIST_H
00018
00019 #include "basics.h"
00020 #ifndef LIST_LANG_C
00021 # include <iostream>
00022 #else
00023 # include <stdio.h>
00024 #endif
00025
00026 #ifdef PRAGMA_I
00027 # pragma interface "list.h"
00028 #endif
00029
00030 #define NULTP (T*)0
00031
00032 #ifndef STD__
00033 # define STD__ std::
00034 #endif
00035
00036 #ifdef NAMESPACE_TBCI
00037 NAMESPACE_TBCI
00038 #endif
00039
00043 template <typename T>
00044 class ListItem {
00045 private:
00046 public:
00047 T* data;
00048 ListItem* next;
00049 ListItem* prev;
00050 public:
00051 ListItem() { data = new T; }
00052 ~ListItem() { delete data; }
00053 } ;
00054
00055
00056
00057
00058
00059 template <typename T> class List;
00060
00061 template <typename T>
00062 class ListIterator
00063 {
00064 protected:
00065 ListItem<T> *curr;
00066 long currnr;
00067 unsigned long vers;
00068 const List<T> *lst;
00069 int dir;
00070 public:
00071
00072 ListIterator (const List<T>& _list, T* dataptr = 0);
00073 ListIterator (const List<T>& _list, ListItem<T>* li = 0);
00074 ListIterator (const List<T>& _list, ListItem<T>* li,
00075 const long nr);
00076 ListIterator (const ListIterator<T>& li) :
00077 curr (li.curr), currnr (li.currnr),
00078 vers (li.vers), lst (li.lst), dir(li.dir) {}
00079
00080 ListIterator<T>& operator = (const ListIterator<T>&);
00081
00082 long getnr ();
00083
00084 T* operator * () const;
00085 operator bool () const;
00086
00087 ListIterator<T>& operator ++ ();
00088 ListIterator<T>& operator -- ();
00089
00090 bool operator == (const ListIterator<T>& li) const;
00091 bool operator != (const ListIterator<T>& li) const;
00092 bool operator < (const ListIterator<T>& li) const;
00093 bool operator > (const ListIterator<T>& li) const;
00094 bool operator <= (const ListIterator<T>& li) const;
00095 bool operator >= (const ListIterator<T>& li) const;
00096
00097 } ;
00098
00099 template <typename T>
00100 ListIterator<T>::ListIterator (const List<T>& _list, T* dataptr)
00101 : vers (_list.vers), lst (&_list), dir (1)
00102 {
00103 if (dataptr)
00104 _list.setcurr (dataptr);
00105 curr = _list.getcurr ();
00106 currnr = _list.getcurrnr ();
00107 }
00108
00109 template <typename T>
00110 ListIterator<T>::ListIterator (const List<T>& _list, ListItem<T>* li )
00111 : vers (_list.vers), lst (&_list), dir (1)
00112 {
00113 if (li)
00114 _list.setcurr (li->data);
00115 curr = _list.getcurr ();
00116 currnr = (long)_list.getcurrnr ();
00117 }
00118
00119 template <typename T>
00120 inline ListIterator<T>::ListIterator (const List<T>& _list, ListItem<T>* li,
00121 const long nr)
00122 : curr (li), currnr (nr), vers (_list.vers), lst (&_list), dir (1)
00123 {}
00124
00125 template <typename T>
00126 inline ListIterator<T>& ListIterator<T>::operator = (const ListIterator<T>& li)
00127 {
00128 curr = li.curr; currnr = li.currnr;
00129 vers = li.vers; lst = li.lst;
00130 dir = 1;
00131 return *this;
00132 }
00133
00134 template <typename T>
00135 inline long ListIterator<T>::getnr ()
00136 {
00137 if (vers != lst->vers) {
00138 currnr = lst->getnr (curr->data);
00139 vers = lst->vers;
00140 }
00141 return currnr;
00142 }
00143
00144 template <typename T>
00145 inline T* ListIterator<T>::operator * () const
00146 {
00147 return curr->data;
00148 }
00149
00150 template <typename T>
00151 inline ListIterator<T>::operator bool () const
00152 {
00153 if (curr)
00154 return true;
00155 else
00156 return false;
00157 }
00158
00159
00160 template <typename T>
00161 inline ListIterator<T>& ListIterator<T>::operator ++ ()
00162 {
00163 if (curr)
00164 if (dir > 0) {
00165 curr = curr->next; currnr++;
00166 } else {
00167 curr = curr->prev; currnr--;
00168 }
00169 else
00170 if (dir > 0) {
00171 if (currnr <= 0) {
00172 curr = lst->root;
00173 currnr = 1;
00174 }
00175 } else {
00176 if (currnr > 0 ) {
00177 curr = lst->last;
00178 currnr = lst->count;
00179 }
00180 }
00181 return (*this);
00182 }
00183
00184 template <typename T>
00185 inline ListIterator<T>& ListIterator<T>::operator -- ()
00186 {
00187 if (curr)
00188 if (dir > 0) {
00189 curr = curr->prev; currnr--;
00190 } else {
00191 curr = curr->next; currnr++;
00192 }
00193 else
00194 if (dir > 0) {
00195 if (currnr > 0 ) {
00196 curr = lst->last;
00197 currnr = lst->count;
00198 }
00199 } else {
00200 if (currnr <= 0) {
00201 curr = lst->root;
00202 currnr = 1;
00203 }
00204 }
00205 return (*this);
00206 }
00207
00208 template <typename T>
00209 inline bool ListIterator<T>::operator == (const ListIterator<T>& li) const
00210 {
00211 if (lst == li.lst && currnr == li.currnr)
00212 return true;
00213 else
00214 return false;
00215 }
00216
00217 template <typename T>
00218 inline bool ListIterator<T>::operator != (const ListIterator<T>& li) const
00219 {
00220 return !(*this == li);
00221 }
00222
00223 template <typename T>
00224 inline bool ListIterator<T>::operator < (const ListIterator<T>& li) const
00225 {
00226 if (lst != li.lst )
00227 abort ();
00228 return (dir * currnr < li.dir * li.currnr);
00229 }
00230
00231 template <typename T>
00232 inline bool ListIterator<T>::operator <= (const ListIterator<T>& li) const
00233 {
00234 if (lst != li.lst )
00235 abort ();
00236 return (dir * currnr <= li.dir * li.currnr);
00237 }
00238
00239 template <typename T>
00240 inline bool ListIterator<T>::operator > (const ListIterator<T>& li) const
00241 {
00242 return !(*this <= li);
00243 }
00244
00245 template <typename T>
00246 inline bool ListIterator<T>::operator >= (const ListIterator<T>& li) const
00247 {
00248 return !(*this < li);
00249 }
00250
00251
00252 template <typename T>
00253 class ListRIterator : public ListIterator<T>
00254 {
00255 protected:
00256 using ListIterator<T>::dir;
00257 using ListIterator<T>::curr;
00258 using ListIterator<T>::currnr;
00259 using ListIterator<T>::vers;
00260 using ListIterator<T>::lst;
00261 public:
00262 ListRIterator (const List<T>& _list, T* dataptr)
00263 : ListIterator<T> (_list, dataptr) { dir = -1; }
00264 ListRIterator (const List<T>& _list, ListItem<T>* li)
00265 : ListIterator<T> (_list, li) { dir = -1; }
00266 ListRIterator (const List<T>& _list, ListItem<T>* li,
00267 const unsigned long nr)
00268 : ListIterator<T> (_list, li, nr) { dir = -1; }
00269
00270
00271 ListRIterator<T>& operator = (const ListIterator<T>&);
00272 } ;
00273
00274 template <typename T>
00275 inline ListRIterator<T>& ListRIterator<T>::operator = (const ListIterator<T>& li)
00276 {
00277 curr = li.curr; currnr = li.currnr;
00278 vers = li.vers; lst = li.lst;
00279 dir = 1;
00280 return *this;
00281 }
00282
00288 template <typename T>
00289 class List {
00290 protected:
00291 mutable ListItem<T> *curr;
00292 unsigned long count;
00293 mutable unsigned long currnr;
00294 unsigned long vers;
00295
00296 void checklast ();
00297 ListItem<T> *app ();
00298
00299 protected:
00300 ListItem<T> *root;
00301 ListItem<T> *last;
00302 ListItem<T> *detached;
00303
00304 public:
00305 friend class ListIterator<T>;
00306 typedef ListIterator<T> iterator;
00307 friend class ListRIterator<T>;
00308 typedef ListRIterator<T> riterator;
00309
00310 List () : curr(NULL), count(0), currnr(0),
00311 vers(0), root(NULL), last(NULL), detached(NULL) {}
00312 List (const List<T>&);
00313 List<T>& operator = (const List<T>&);
00314 List<T>& alias (const List<T>&);
00315
00316 iterator begin () const;
00317 iterator end () const;
00318 riterator rbegin () const;
00319 riterator rend () const;
00320
00321 T* append ();
00322 T* append (T*);
00323 void erase (T*);
00324 void deltree (T*);
00325 void deltree ();
00326
00327
00328
00329 ~List () { deltree (); }
00330
00331 T* getfirst () const;
00332 T* getlast () const;
00333 T* getcurr () const;
00334 T* getnext () const;
00335 T* getprev () const;
00336 T* setfirst () const;
00337 T* setlast () const;
00338 T* setnext () const;
00339 T* setprev () const;
00340 T* inscurr ();
00341 T* inscurr (T*);
00342 T* delcurr ();
00343 T* detachcurr ();
00344
00345 unsigned long getlength () const;
00346 unsigned long size () const;
00348 unsigned long getcurrnr () const;
00349 unsigned long getnr (const T*) const;
00350 unsigned long getnr () const;
00351 T* getbynr (long) const;
00352
00353 T* setcurrnr (const unsigned long) const;
00354 T* setcurr (const T* rec) const { setcurrnr (getnr (rec)); return getcurr (); }
00355
00356 void dumpList () const;
00357 } ;
00358
00359
00360
00361 template <typename T>
00362 inline void List<T>::checklast ()
00363 {
00364 while (last -> next != NULL) {
00365 last = last -> next; count++;
00366 }
00367 }
00368
00369
00370 template <typename T>
00371 List<T>::List (const List<T>& l)
00372 {
00373 ListItem<T>* tmp = l.root; vers = l.vers;
00374 root = NULL; last = NULL; curr = NULL; detached = NULL; count = 0;
00375 while (tmp) {
00376 curr = app();
00377
00378 *(curr->data) = *(tmp->data);
00379 tmp = tmp->next;
00380 }
00381 }
00382
00383
00384 template <typename T>
00385 List<T>& List<T>::operator = (const List<T>& l)
00386 {
00387 deltree ();
00388 ListItem<T>* tmp = l.root;
00389 root = NULL; last = NULL; curr = NULL; detached = NULL;
00390 count = 0; vers++;
00391 while (tmp) {
00392 curr = app();
00393
00394 *(curr->data) = *(tmp->data);
00395 tmp = tmp->next;
00396 }
00397 return *this;
00398 }
00399
00400
00401 template <typename T>
00402 List<T>& List<T>::alias (const List<T>& l)
00403 {
00404 deltree ();
00405 ListItem<T>* tmp = l.root; vers = l.vers;
00406 root = NULL; last = NULL; curr = NULL; detached = NULL; count = 0;
00407 while (tmp) {
00408 curr = app();
00409 curr->data = tmp->data;
00410 tmp = tmp->next;
00411 }
00412 return *this;
00413 }
00414
00415
00416 template <typename T>
00417 ListItem<T>* List<T>::app ()
00418 {
00419 count++; currnr = count; vers++;
00420 if (!root) {
00421 curr = new ListItem<T>;
00422 curr->prev = NULL; curr->next = NULL;
00423 root = curr; last = curr;
00424 return curr;
00425 } else {
00426
00427 curr = new ListItem<T>;
00428 curr->prev = last; curr->next = NULL;
00429 last->next = curr; last = curr;
00430 return curr;
00431 }
00432 }
00433
00434
00435 template <typename T>
00436 inline T* List<T>::append ()
00437 {
00438 return app()->data;
00439 }
00440
00441 template <typename T>
00442 inline T* List<T>::append (T* data)
00443 {
00444 T *tmp = this->append ();
00445 *tmp = *data; return tmp;
00446 }
00447
00448
00449 template <typename T>
00450 T* List<T>::inscurr ()
00451 {
00452 if (!curr) return append();
00453 count++; vers++;
00454 if (!(curr->prev)) {
00455 curr = new ListItem<T>; curr->prev = NULL; curr->next = root;
00456 root->prev = curr; root = curr;
00457 } else {
00458 ListItem<T> *ins = new ListItem<T>;
00459 ins->next = curr; ins->prev = curr->prev;
00460 ins->prev->next = ins; curr->prev = ins;
00461 curr = ins;
00462 }
00463 return curr->data;
00464 }
00465
00466 template <typename T>
00467 inline T* List<T>::inscurr (T* elem)
00468 {
00469 T* ptr = inscurr ();
00470 *ptr = *elem;
00471 return ptr;
00472 }
00473
00474 template <typename T>
00475 T* List<T>::delcurr ()
00476 {
00477 if (curr == NULL) return NULTP;
00478 count--; vers++;
00479 if (curr->next == NULL) {
00480 currnr = count;
00481 if (curr->prev == NULL) {
00482 delete curr;
00483 root=NULL; curr=NULL; last=NULL;
00484 return NULTP;
00485 } else {
00486 last = curr->prev;
00487 curr->prev->next = NULL;
00488 delete curr;
00489 curr = NULL;
00490 return NULTP;
00491 }
00492 } else {
00493 if (curr->prev == NULL) {
00494 curr = curr->next;
00495 delete curr->prev;
00496 curr->prev = NULL;
00497 root = curr;
00498 } else {
00499 curr->prev->next = curr->next;
00500 curr->next->prev = curr->prev;
00501 ListItem<T> *del = curr;
00502 curr = curr->next;
00503 delete del;
00504 }
00505 }
00506 return curr->data;
00507 }
00508
00509 template <typename T>
00510 T* List<T>::detachcurr ()
00511 {
00512 if (curr == NULL) return NULTP;
00513 count--; vers++;
00514 if (curr->next == NULL) {
00515 currnr = count;
00516 if (curr->prev == NULL) {
00517
00518
00519 curr->next = detached;
00520 detached = curr;
00521 root=NULL; curr=NULL; last=NULL;
00522 return NULTP;
00523 } else {
00524 last = curr->prev;
00525 curr->prev->next = NULL;
00526
00527
00528 curr->next = detached;
00529 detached = curr;
00530 curr = NULL;
00531 return NULTP;
00532 }
00533 } else {
00534 if (curr->prev == NULL) {
00535 curr = curr->next;
00536
00537
00538 curr->prev->next = detached;
00539 detached = curr->prev;
00540 curr->prev = NULL;
00541 root = curr;
00542 } else {
00543 curr->prev->next = curr->next;
00544 curr->next->prev = curr->prev;
00545 ListItem<T> *del = curr;
00546 curr = curr->next;
00547
00548
00549 del->next = detached;
00550 detached = del;
00551 }
00552 }
00553 return curr->data;
00554 }
00555
00557 template <typename T>
00558 void List<T>::deltree (T* delroot)
00559 {
00560 if (last == NULL) return;
00561
00562 vers++;
00563
00564 while (!(last->data == delroot)) {
00565 count--; currnr = count;
00566 curr = last->prev; delete last; last = curr;
00567 if (curr == NULL) {
00568 #ifdef LIST_LANG_C
00569 fprintf(stderr,"List::deltree: error: wrong pointer provided !\n");
00570 #else
00571 STD__ cerr << "List::deltree: error: wrong pointer provided !" << '\n';
00572 #endif
00573 root = NULL; return;
00574 }
00575 else curr->next = NULL;
00576 }
00577
00578 count --; currnr = count;
00579 curr = last->prev; delete last; last = curr;
00580 if (curr == NULL) root = NULL;
00581 else curr->next = NULL;
00582 }
00583
00584
00585
00586
00587 template <typename T>
00588 inline void List<T>::deltree ()
00589 {
00590 if (root != NULL)
00591 deltree (root -> data);
00592 while (detached) {
00593 ListItem<T>* del = detached->next;
00594 delete detached;
00595 detached = del;
00596 }
00597 }
00598
00599
00600
00601
00602 template <typename T>
00603 inline typename List<T>::iterator List<T>::begin () const
00604 { return ListIterator<T> (*this, root, (long)1); }
00605 template <typename T>
00606 inline typename List<T>::iterator List<T>::end () const
00607 { return ListIterator<T> (*this, 0, (long)count+1); }
00608 template <typename T>
00609 inline typename List<T>::riterator List<T>::rbegin () const
00610 { return ListRIterator<T> (*this, last, (long)count); }
00611 template <typename T>
00612 inline typename List<T>::riterator List<T>::rend () const
00613 { return ListRIterator<T> (*this, 0, (long)0); }
00614
00615
00616 template <typename T>
00617 inline T* List<T>::getfirst () const
00618 { return (root?root->data:NULTP); }
00619
00620 template <typename T>
00621 inline T* List<T>::getlast () const
00622 { return (last?last->data:NULTP); }
00623
00624 template <typename T>
00625 inline T* List<T>::getcurr () const
00626 { return (curr?curr->data:NULTP); }
00627
00628 template <typename T>
00629 inline T* List<T>::getnext () const
00630 { if (!curr || !curr->next) return NULTP;
00631 else return curr->next->data; }
00632
00633 template <typename T>
00634 inline T* List<T>::getprev () const
00635 { if (!curr || !curr->prev) return NULTP;
00636 else return curr->prev->data; }
00637
00638 template <typename T>
00639 inline T* List<T>::setfirst () const
00640 { curr = root; currnr = 1; return (curr?curr->data:NULTP); }
00641
00642 template <typename T>
00643 inline T* List<T>::setlast () const
00644 { curr = last; currnr = count; return (curr?curr->data:NULTP); }
00645
00646 template <typename T>
00647 inline T* List<T>::setnext () const
00648 { if (!curr || !curr->next) return NULTP;
00649 else curr = curr->next; currnr++; return curr->data; }
00650
00651 template <typename T>
00652 inline T* List<T>::setprev () const
00653 { if (!curr || !curr->prev) return NULTP;
00654 else curr = curr->prev; currnr--; return curr->data; }
00655
00656 template <typename T>
00657 inline unsigned long List<T>::getlength () const
00658 { return count; }
00659
00660 template <typename T>
00661 inline unsigned long List<T>::size () const
00662 { return count; }
00663
00664 template <typename T>
00665 inline unsigned long List<T>::getcurrnr () const
00666 { return currnr; }
00667
00668 template <typename T>
00669 void List<T>::erase (T* rec)
00670 {
00671 if (root==NULL)
00672 return;
00673 ListItem<T> *ptr = root;
00674 unsigned int ctr = 0;
00675 while (ptr) {
00676 ctr++;
00677 if (rec == ptr->data) break;
00678 ptr = ptr->next;
00679 }
00680 if (!ptr)
00681 return;
00682 if (ptr->prev)
00683 ptr->prev = ptr->next;
00684 else
00685 root = ptr->next;
00686 if (last == ptr)
00687 last = ptr->prev;
00688 count--;
00689 if (currnr > ctr)
00690 currnr--;
00691 else if (currnr == ctr) {
00692 if (ptr->prev) {
00693 curr = ptr->prev;
00694 currnr--;
00695 } else
00696 curr = root;
00697 }
00698 delete ptr;
00699 }
00700
00701 template <typename T>
00702 unsigned long List<T>::getnr (const T* rec) const
00703 {
00704 if (root==NULL) return 0;
00705 ListItem<T> *ptr = root;
00706 long cntr = 0;
00707 while (ptr) {
00708 cntr++;
00709 if (rec == ptr->data) return cntr;
00710 ptr = ptr->next;
00711 }
00712 return 0;
00713 }
00714
00715 template <typename T>
00716 inline unsigned long List<T>::getnr () const
00717 { if (curr != NULL) return getnr(curr->data); else return 0; }
00718
00719 template <typename T>
00720 T* List<T>::getbynr (long ctr) const
00721 {
00722 if ((unsigned)ctr >= count || root == NULL)
00723 return NULTP;
00724 ListItem<T> *ptr = root;
00725 while (ptr && ctr--)
00726 ptr = ptr->next;
00727 if (ctr == -1)
00728 return ptr->data;
00729 else
00730 return NULTP;
00731 }
00732
00733 template <typename T>
00734 T* List<T>::setcurrnr (const unsigned long nr) const
00735 {
00736 curr = root; currnr = 0;
00737 while (curr && ++currnr < nr)
00738 curr = curr->next;
00739 if (curr) return curr->data;
00740 else return NULTP;
00741 }
00742
00743 template <typename T>
00744 void List<T>::dumpList () const
00745 {
00746 ListItem<T>* tmp = root;
00747 printf ("Length:%li Curr:%li ", count, currnr);
00748 printf ("ROOT=%p CURR=%p LAST=%p\n", root, curr, last);
00749 while (tmp) {
00750 printf ("Elem:%p Prev:%p Next:%p Data:%p\n", tmp, tmp->prev, tmp->next, tmp->data);
00751 tmp = tmp->next;
00752 }
00753 }
00754
00755 #ifdef __WATCOMC__
00756 # define EQDOUBLE
00757 #else
00758 # define EQDOUBLE = double
00759 #endif
00760
00767 template <typename T, typename S EQDOUBLE>
00768 class nsList: public List<T>
00769 {
00770 protected:
00771 using List<T>::root;
00772 using List<T>::last;
00773 using List<T>::curr;
00774 using List<T>::currnr;
00775 using List<T>::setlast;
00776 bool dir;
00777 void quick (ListItem<T>*, ListItem<T>*);
00778 public:
00779 nsList () : List<T> () { dir = false; }
00780 void qsort (bool = false);
00781 T* sortin_r (T&, bool = false);
00782 long move_window (const S & val) const;
00783 } ;
00784
00785 template <typename T, typename S>
00786 void nsList<T,S>::quick (ListItem<T>* left, ListItem<T>* right)
00787 {
00788
00789 ListItem<T>* le = left; ListItem<T>* ri = right;
00790
00791 S test = (S)(((double)le->data->getval()+(double)ri->data->getval())/2);
00792 T* tmp;
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805 int lesri = 1;
00806 while (lesri >= 0) {
00807 while ((dir?le->data->getval()>test:le->data->getval()<test)) {
00808 le = le->next;
00809 if (lesri == 0)
00810 lesri = -1;
00811 else if (le == ri)
00812 lesri = 0;
00813 }
00814
00815 while ((dir? ri->data->getval() < test: ri->data->getval() > test)) {
00816 ri = ri->prev;
00817 if (lesri == 0)
00818 lesri = -1;
00819 else if (le == ri)
00820 lesri = 0;
00821 }
00822
00823 if (lesri == 1) {
00824 tmp = le->data; le->data = ri->data; ri->data = tmp;
00825 le = le->next; if (le == ri) lesri = 0;
00826 ri = ri->prev;
00827 if (lesri == 0) lesri = -1;
00828 else if (le == ri) lesri = 0;
00829 }
00830 else if (lesri == 0) {
00831 if (le != right)
00832 le = le->next; lesri = -1;
00833 if (ri != left)
00834 ri = ri->prev;
00835 }
00836
00837 }
00838
00839 if (left != ri)
00840 quick(left,ri);
00841 if (le != right)
00842 quick(le,right);
00843 }
00844
00849 template <typename T, typename S>
00850 void nsList<T,S>::qsort (bool desc)
00851 {
00852 dir = desc;
00853 if (root == NULL || root == last)
00854 return;
00855 quick(root,last);
00856 }
00857
00858 template <class T,class S>
00859 T* nsList<T,S>::sortin_r (T& dat, bool frst)
00860 {
00861 bool sortedin = false;
00862 ListItem<T> *ptr, *ptr2;
00863 ptr2 = (frst? root: last);
00864 bool comp = (dat.getval() < ptr2->data->getval()) ^ dir;
00865
00866 if (frst) {
00867 ptr2 = root;
00868 #ifdef LIST_LANG_C
00869 fprintf (stderr, "Not yet implemented !\n");
00870 #else
00871 STD__ cerr << "Not yet implemented !\n";
00872 #endif
00873 }
00874
00875 else
00876 {
00877
00878 ptr2 = last;
00879 if (!comp) return ptr2->data;
00880
00881 *(ptr2->data) = dat;
00882 ptr2 = ptr2->prev;
00883 if (!ptr2) return last->data;
00884 ptr2->next = NULL;
00885 ptr = last; last = ptr2;
00886 while (ptr2 && !sortedin) {
00887 comp = (dat.getval() < ptr2->data->getval()) ^ dir;
00888
00889 if (!comp) {
00890 ptr->prev = ptr2; ptr->next = ptr2->next;
00891 if (ptr2->next) {
00892 ptr2->next->prev = ptr; ptr2->next = ptr;
00893 }
00894 else
00895 last = ptr;
00896 sortedin = true;
00897 }
00898 ptr2 = ptr2->prev;
00899 }
00900
00901 if (!sortedin) {
00902 ptr->prev = NULL; ptr->next = root;
00903 root->prev = ptr; root = ptr;
00904 }
00905
00906 return (setlast ());
00907 }
00908 }
00909
00910
00911
00912
00913
00914
00915
00916
00917 template <typename T, typename S>
00918 long nsList<T, S>::move_window (const S & val) const
00919 {
00920 long oldnr = currnr;
00921 if (!curr) {
00922 curr = root; currnr = 1;
00923 if (!curr)
00924 abort ();
00925 }
00926 ListItem<T>* next = curr->next;
00927 if (!dir) {
00928
00929
00930 if ( (curr == root || curr->data->getval() <= val)
00931 && (!next || next->data->getval() >= val))
00932 return (currnr - oldnr);
00933
00934
00935 if (next)
00936 while (next->next && next->data->getval() < val) {
00937 next = next->next; currnr++;
00938 }
00939 if (curr->next != next) {
00940 curr = next->prev;
00941 return (currnr - oldnr);
00942 }
00943
00944 while (curr->prev && curr->data->getval() > val) {
00945 curr = curr->prev; currnr--;
00946 }
00947
00948 return (currnr - oldnr);
00949 } else {
00950
00951
00952 if ( (curr == root || curr->data->getval() >= val)
00953 && (!next || next->data->getval() <= val))
00954 return (currnr - oldnr);
00955
00956
00957 if (next)
00958 while (next->next && next->data->getval() > val) {
00959 next = next->next; currnr++;
00960 }
00961 if (curr->next != next) {
00962 curr = next->prev;
00963 return (currnr - oldnr);
00964 }
00965
00966 while (curr->prev && curr->data->getval() < val) {
00967 curr = curr->prev; currnr--;
00968 }
00969
00970 return (currnr - oldnr);
00971 }
00972 }
00973
00974 #ifdef NAMESPACE_TBCI
00975 NAMESPACE_END
00976 #endif
00977
00978 #endif