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