38 #ifndef DAL_TREE_SORTED_H__
39 #define DAL_TREE_SORTED_H__
52 static const size_t DEPTHMAX__ = 64;
53 static const size_t ST_NIL = size_t(-1);
55 template<
typename T,
typename COMP = gmm::less<T>,
unsigned char pks = 5>
56 class dynamic_tree_sorted;
58 template<
typename T,
typename COMP,
unsigned char pks>
struct tsa_iterator {
60 typedef value_type& reference;
61 typedef value_type* pointer;
63 typedef ptrdiff_t difference_type;
64 typedef std::bidirectional_iterator_tag iterator_category;
67 dynamic_tree_sorted<T, COMP, pks> *p;
73 tsa_iterator(dynamic_tree_sorted<T, COMP, pks> &tsa)
74 { p = &tsa; depth = 0; }
75 void copy(
const tsa_iterator<T, COMP, pks> &it);
76 tsa_iterator(
const tsa_iterator &it) {
copy(it); }
77 tsa_iterator &operator =(
const tsa_iterator &it)
78 {
copy(it);
return *
this;}
81 {
return (depth==0) ? ST_NIL : path[depth-1];}
83 {
return (depth<=1) ? ST_NIL : path[depth-2];}
85 {
return path[(depth-1) & 63]; }
87 {
return (depth==0) ? 0 : dir[depth-1];}
88 inline void up(
void) {
if (depth > 0) depth--; }
90 void down_right(
void);
91 void down_left_all(
void);
92 void down_right_all(
void);
93 void root(
void) { path[0] = p->root_elt(); dir[0] = 0; depth = 1; }
94 void first(
void) { root(); down_left_all(); }
95 void last(
void) { root(); down_right_all(); }
96 void end(
void) { depth = 0; }
98 tsa_iterator &operator ++();
99 tsa_iterator &operator --();
100 tsa_iterator operator ++(
int)
101 { tsa_iterator tmp = *
this; ++(*this);
return tmp; }
102 tsa_iterator operator --(
int)
103 { tsa_iterator tmp = *
this; --(*this);
return tmp; }
105 reference operator *()
const {
return (*p)[index()]; }
106 pointer operator->()
const {
return &(operator*()); }
108 bool operator ==(
const tsa_iterator &i)
const
109 {
return ((i.depth == 0 && depth == 0) || (i.index_() == index_())); }
110 bool operator !=(
const tsa_iterator &i)
const
111 {
return !((i.depth == 0 && depth == 0) || (i.index_() == index_())); }
114 template<
typename T,
typename COMP,
unsigned char pks>
115 void tsa_iterator<T, COMP, pks>::copy(
const tsa_iterator<T, COMP, pks> &it) {
116 p = it.p; depth = it.depth;
117 size_type *p1it=&(path[0]), *pend=&path[depth];
121 while (p1it != pend) { *p1it++ = *p2it++; *d1it++ = *d2it++; }
124 template<
typename T,
typename COMP,
unsigned char pks>
125 void tsa_iterator<T, COMP, pks>::down_left(
void) {
126 GMM_ASSERT3(depth > 0 && depth < DEPTHMAX__ && index() != ST_NIL,
128 path[depth] = p->left_elt(index_()); dir[depth++] = -1;
131 template<
typename T,
typename COMP,
unsigned char pks>
132 void tsa_iterator<T, COMP, pks>::down_right(
void) {
133 GMM_ASSERT3(depth > 0 && depth < DEPTHMAX__ && index() != ST_NIL,
135 path[depth] = p->right_elt(index_()); dir[depth++] = 1;
138 template<
typename T,
typename COMP,
unsigned char pks>
139 void tsa_iterator<T, COMP, pks>::down_left_all(
void)
140 {
while (index_() != ST_NIL) down_left(); up(); }
142 template<
typename T,
typename COMP,
unsigned char pks>
143 void tsa_iterator<T, COMP, pks>::down_right_all(
void)
144 {
while (index_() != ST_NIL) down_right(); up();}
146 template<
typename T,
typename COMP,
unsigned char pks>
147 tsa_iterator<T, COMP, pks> &tsa_iterator<T, COMP, pks>::operator ++() {
148 if (depth == 0) first();
149 if (p->right_elt(index_()) != ST_NIL) { down_right(); down_left_all(); }
150 else { up();
while (dir[depth] == 1) up(); }
154 template<
typename T,
typename COMP,
unsigned char pks>
155 tsa_iterator<T, COMP, pks> &tsa_iterator<T, COMP, pks>::operator --() {
156 if (depth == 0) last();
157 if (p->left_elt(index_()) != ST_NIL) { down_left(); down_right_all(); }
158 else { up();
while (dir[depth] == -1) up(); }
163 template<
typename T,
typename COMP,
unsigned char pks>
struct const_tsa_iterator {
164 typedef T value_type;
165 typedef const value_type& reference;
166 typedef const value_type* pointer;
168 typedef ptrdiff_t difference_type;
169 typedef std::bidirectional_iterator_tag iterator_category;
172 const dynamic_tree_sorted<T, COMP, pks> *p;
177 const_tsa_iterator(
void) {}
178 const_tsa_iterator(
const dynamic_tree_sorted<T, COMP, pks> &tsa)
179 { p = &tsa; depth = 0; }
180 void copy(
const const_tsa_iterator<T, COMP, pks> &it);
181 const_tsa_iterator(
const const_tsa_iterator &it) { this->
copy(it); }
182 const_tsa_iterator(
const tsa_iterator<T, COMP, pks> &it);
183 const_tsa_iterator &operator =(
const const_tsa_iterator &it)
184 {
copy(it);
return *
this; }
187 {
return (depth==0) ? ST_NIL : path[depth-1];}
189 {
return (depth<=1) ? ST_NIL : path[depth-2];}
190 inline size_type index_(
void)
const {
return path[depth-1]; }
192 {
return (depth==0) ?
short_type(0) : dir[depth-1];}
193 inline void up(
void) {
if (depth > 0) depth--; }
194 void down_left(
void);
195 void down_right(
void);
196 void down_left_all(
void);
197 void down_right_all(
void);
198 void root(
void) { path[0] = p->root_elt(); dir[0] = 0; depth = 1; }
199 void first(
void) { root(); down_left_all(); }
200 void last(
void) { root(); down_right_all(); }
201 void end(
void) { depth = 0; }
203 const_tsa_iterator &operator ++();
204 const_tsa_iterator &operator --();
205 const_tsa_iterator operator ++(
int)
206 { const_tsa_iterator tmp = *
this; ++(*this);
return tmp; }
207 const_tsa_iterator operator --(
int)
208 { const_tsa_iterator tmp = *
this; --(*this);
return tmp; }
210 reference operator *()
const {
return (*p)[index()]; }
211 pointer operator->()
const {
return &(operator*()); }
213 bool operator ==(
const const_tsa_iterator &i)
const
214 {
return ((i.depth == 0 && depth == 0) || (i.index_() == index_())); }
215 bool operator !=(
const const_tsa_iterator &i)
const
216 {
return !((i.depth == 0 && depth == 0) || (i.index_() == index_())); }
219 template<
typename T,
typename COMP,
unsigned char pks>
221 const const_tsa_iterator<T,COMP,pks>& it) {
222 o <<
"const_tsa_iterator : depth=" << it.depth <<
", path/dir=[";
223 for (
unsigned i=0; i < it.depth; ++i)
224 o <<
"{" << it.path[i] <<
", " <<
int(it.dir[i]) <<
"} ";
229 template<
typename T,
typename COMP,
unsigned char pks>
230 void const_tsa_iterator<T, COMP, pks>::copy
231 (
const const_tsa_iterator<T, COMP, pks> &it) {
232 p = it.p; depth = it.depth;
233 size_type *p1it=&(path[0]), *pend=&path[depth];
237 while (p1it != pend) { *p1it++ = *p2it++; *d1it++ = *d2it++; }
240 template<
typename T,
typename COMP,
unsigned char pks>
241 const_tsa_iterator<T, COMP, pks>::const_tsa_iterator
242 (
const tsa_iterator<T, COMP, pks> &it) {
243 p = it.p; depth = it.depth;
244 size_type *p1it=&(path[0]), *pend=&path[depth];
248 while (p1it != pend) { *p1it++ = *p2it++; *d1it++ = *d2it++; }
251 template<
typename T,
typename COMP,
unsigned char pks>
252 void const_tsa_iterator<T, COMP, pks>::down_left(
void) {
253 GMM_ASSERT3(depth > 0 && depth < DEPTHMAX__ && index() != ST_NIL,
255 path[depth] = p->left_elt(index_()); dir[depth++] = -1;
258 template<
typename T,
typename COMP,
unsigned char pks>
259 void const_tsa_iterator<T, COMP, pks>::down_right(
void) {
260 GMM_ASSERT3(depth > 0 && depth < DEPTHMAX__ && index() != ST_NIL,
262 path[depth] = p->right_elt(index_()); dir[depth++] = 1;
265 template<
typename T,
typename COMP,
unsigned char pks>
266 void const_tsa_iterator<T, COMP, pks>::down_left_all(
void)
267 {
while (index_() != ST_NIL) down_left(); up(); }
269 template<
typename T,
typename COMP,
unsigned char pks>
270 void const_tsa_iterator<T, COMP, pks>::down_right_all(
void)
271 {
while (index_() != ST_NIL) down_right(); up();}
273 template<
typename T,
typename COMP,
unsigned char pks>
274 const_tsa_iterator<T, COMP, pks> &
275 const_tsa_iterator<T, COMP, pks>::operator ++() {
276 if (depth == 0) last();
277 if (p->right_elt(index_()) != ST_NIL) { down_right(); down_left_all(); }
278 else { up();
while (dir[depth] == 1) up(); }
282 template<
typename T,
typename COMP,
unsigned char pks>
283 const_tsa_iterator<T, COMP, pks> &
284 const_tsa_iterator<T, COMP, pks>::operator --() {
285 if (depth == 0) last();
286 if (p->left_elt(index_()) != ST_NIL) { down_left(); down_right_all(); }
287 else { up();
while (dir[depth] == -1) up(); }
295 template<
typename T,
typename COMP,
unsigned char pks>
296 class dynamic_tree_sorted :
public dynamic_tas<T, pks> {
299 typedef typename dynamic_tas<T, pks>::tas_iterator tas_iterator;
300 typedef typename dynamic_tas<T, pks>::const_tas_iterator const_tas_iterator;
301 typedef typename dynamic_tas<T, pks>::iterator iterator;
302 typedef typename dynamic_tas<T, pks>::const_iterator const_iterator;
306 typedef tsa_iterator<T, COMP, pks> sorted_iterator;
307 typedef const_tsa_iterator<T, COMP, pks> const_sorted_iterator;
308 typedef std::reverse_iterator<const_iterator> const_reverse_sorted_iterator;
309 typedef std::reverse_iterator<iterator> reverse_sorted_iterator;
317 inline void init(
void) { eq = 0; r = l = ST_NIL; }
318 tree_elt(
void) { init(); }
321 dynamic_array<tree_elt, pks> nodes;
330 void add_index(
size_type i, const_sorted_iterator &it);
331 void sup_index(
size_type i, const_sorted_iterator &it);
337 if (i == ST_NIL)
return 0;
338 int l = verify_balance(nodes[i].l);
339 int r = verify_balance(nodes[i].r);
340 GMM_ASSERT3(
short_type(r - l) == nodes[i].eq &&
341 (nodes[i].eq <= 1 && nodes[i].eq>=-1),
"internal error");
342 return std::max(l,r) + 1;
345 void insert_path(
const T &elt, const_sorted_iterator &it)
const;
346 void search_sorted_iterator(
const T &elt,
347 const_sorted_iterator &it)
const;
348 void find_sorted_iterator(
size_type i, const_sorted_iterator &it)
const;
349 COMP &comparator(
void) {
return compar; }
350 const COMP &comparator(
void)
const {
return compar; }
352 dynamic_tree_sorted(COMP cp = COMP())
353 { first_node = ST_NIL; compar = cp; }
355 size_type root_elt(
void)
const {
return first_node; }
359 {
return short_type((n == ST_NIL) ? 0 : nodes[n].eq); }
361 const_sorted_iterator it(*
this);
362 search_sorted_iterator(elt,it);
368 { first_node = ST_NIL; nodes.clear(); dynamic_tas<T,pks>::clear(); }
371 size_type add_norepeat(
const T &,
bool replace =
false,
372 bool *present = NULL);
378 sorted_iterator sorted_begin(
void)
379 { sorted_iterator it(*
this); it.first();
return it; }
380 const_sorted_iterator sorted_begin(
void)
const
381 { const_sorted_iterator it(*
this); it.first();
return it; }
382 sorted_iterator sorted_end(
void)
383 { sorted_iterator it(*
this); it.end();
return it; }
384 const_sorted_iterator sorted_end(
void)
const
385 { const_sorted_iterator it(*
this); it.end();
return it; }
386 reverse_sorted_iterator rbegin(
void)
387 {
return reverse_sorted_iterator(this->
end()); }
388 const_reverse_sorted_iterator rbegin(
void)
const
389 {
return const_reverse_sorted_iterator(this->
end()); }
390 reverse_sorted_iterator rend(
void)
391 {
return reverse_sorted_iterator(this->
begin()); }
392 const_reverse_sorted_iterator rend(
void)
const
393 {
return const_reverse_sorted_iterator(this->
begin()); }
394 sorted_iterator sorted_first(
void)
395 { sorted_iterator it(*
this); it.first();
return it; }
396 const_sorted_iterator sorted_first(
void)
const
397 { const_sorted_iterator it(*
this); it.first();
return it; }
398 sorted_iterator sorted_last(
void)
399 { sorted_iterator it(*
this); it.last();
return it; }
400 const_sorted_iterator sorted_last(
void)
const
401 { const_sorted_iterator it(*
this); it.last();
return it; }
403 const_sorted_iterator sorted_ge(
const T &elt)
const;
406 template<
typename T,
typename COMP,
unsigned char pks>
407 std::ostream& operator <<(std::ostream& o,
408 dynamic_tree_sorted<T, COMP, pks> &m) {
409 o <<
"Nomber of elt :" << m.card() <<
'\n';
410 o <<
"Index du noeud racine :" << m.root_elt() <<
'\n';
411 for (
size_t i = 0; i < m.size(); ++i)
412 o <<
"elt " << i <<
" left :" <<
int(m.left_elt(i)) <<
" right : "
413 << int(m.right_elt(i)) <<
" balance :" << int(m.balance(i)) <<
'\n';
417 template<
typename T,
typename COMP,
unsigned char pks>
419 dynamic_tree_sorted<T, COMP, pks>::rotate_right(
size_type i) {
420 tree_elt *pni = &(nodes[i]);
422 tree_elt *pnf = &(nodes[f]);
423 pni->l = pnf->r; pnf->r = i; pnf->eq = pni->eq = 0;
427 template<
typename T,
typename COMP,
unsigned char pks>
429 dynamic_tree_sorted<T, COMP, pks>::rotate_left(
size_type i) {
430 tree_elt *pni = &(nodes[i]);
432 tree_elt *pnf = &(nodes[f]);
433 pni->r = pnf->l; pnf->l = i; pnf->eq = pni->eq = 0;
437 template<
typename T,
typename COMP,
unsigned char pks>
439 dynamic_tree_sorted<T, COMP, pks>::rotate_left_right(
size_type i) {
440 tree_elt *pni = &(nodes[i]);
442 tree_elt *pnf = &(nodes[f]);
443 short_type uba = pnf->eq, ubb = nodes[pnf->r].eq;
444 pni->l = rotate_left(f); f = rotate_right(i);
447 nodes[pnf->l].eq =
short_type(uba - 1 - ((ubb == 1) ? 1 : 0));
448 nodes[pnf->r].eq =
short_type(((ubb == -1) ? 1 : 0));
450 if (uba == 0 && ubb == 1)
452 pnf->l = balance_again(pnf->l);
453 if (nodes[pnf->l].eq == 0) pnf->eq = 0;
458 template<
typename T,
typename COMP,
unsigned char pks>
460 dynamic_tree_sorted<T, COMP, pks>::rotate_right_left(
size_type i) {
462 short_type uba = nodes[f].eq, ubb = nodes[nodes[f].l].eq;
463 nodes[i].r = rotate_right(f); f = rotate_left(i);
465 nodes[nodes[f].r].eq =
short_type(uba + 1 + ((ubb == -1) ? 1 : 0));
466 nodes[nodes[f].l].eq =
short_type(((ubb == +1) ? -1 : 0));
468 if (uba == 0 && ubb == -1) {
469 nodes[f].r = balance_again(nodes[f].r);
470 if (nodes[nodes[f].r].eq == 0) nodes[f].eq = 0;
475 template<
typename T,
typename COMP,
unsigned char pks>
477 dynamic_tree_sorted<T, COMP, pks>::balance_again(
size_type i) {
478 tree_elt *pn = &(nodes[i]);
480 case -2 :
if (nodes[pn->l].eq == -1)
return rotate_right(i);
481 else return rotate_left_right(i);
482 case +2 :
if (nodes[pn->r].eq == 1)
return rotate_left(i);
483 else return rotate_right_left(i);
484 case 0 :
case -1 :
case 1 :
return i;
485 default : GMM_ASSERT3(
false,
"internal error");
490 template<
typename T,
typename COMP,
unsigned char pks>
491 void dynamic_tree_sorted<T, COMP, pks>::search_sorted_iterator
492 (
const T &elt, const_sorted_iterator &it)
const{
494 while (it.index() != ST_NIL) {
495 int cp = compar(elt, (*
this)[it.index()]);
496 if (cp < 0) it.down_left();
497 else if (cp > 0) it.down_right();
else break;
501 template<
typename T,
typename COMP,
unsigned char pks>
502 void dynamic_tree_sorted<T, COMP, pks>::find_sorted_iterator
503 (
size_type i, const_sorted_iterator &it)
const {
504 const T *pelt = &((*this)[i]);
506 while (it.index() != ST_NIL) {
507 int cp = compar(*pelt, (*
this)[it.index()]);
508 if (cp == 0) {
if (it.index() == i)
break;
else it.down_left(); }
509 else if (cp < 0) it.down_left();
else it.down_right();
511 if (it.index() == ST_NIL) it.up();
512 while (it.index() != i && it.index() != ST_NIL) ++it;
517 template<
typename T,
typename COMP,
unsigned char pks>
518 void dynamic_tree_sorted<T, COMP, pks>::insert_path
519 (
const T &elt, const_sorted_iterator &it)
const {
521 while (it.index() != ST_NIL) {
522 int cp = compar(elt, (*
this)[it.index()]);
523 if (cp <= 0) it.down_left();
else it.down_right();
527 template<
typename T,
typename COMP,
unsigned char pks>
529 dynamic_tree_sorted<T, COMP, pks>::search_ge(
const T &elt)
const {
530 const_sorted_iterator it(*
this); insert_path(elt, it);
532 if (it.index() == ST_NIL)
533 { it.up();
if (it.index() != ST_NIL && dir == +1) ++it; }
547 template<
typename T,
typename COMP,
unsigned char pks>
548 typename dynamic_tree_sorted<T, COMP, pks>::const_sorted_iterator
549 dynamic_tree_sorted<T, COMP, pks>::sorted_ge(
const T &elt)
const {
550 const_sorted_iterator it(*
this); insert_path(elt, it);
553 if (it.index() != ST_NIL && dir == +1) ++it;
558 template<
typename T,
typename COMP,
unsigned char pks>
560 dynamic_tree_sorted<T, COMP, pks>::memsize(
void)
const {
561 return dynamic_tas<T, pks>::memsize() + nodes.memsize()
562 +
sizeof(dynamic_tree_sorted<T, COMP, pks>);
565 template<
typename T,
typename COMP,
unsigned char pks>
566 void dynamic_tree_sorted<T, COMP, pks>::compact(
void) {
568 while (this->ind.last_true() >= this->ind.card())
569 swap(this->ind.first_false(), this->ind.last_true());
572 template<
typename T,
typename COMP,
unsigned char pks>
573 void dynamic_tree_sorted<T, COMP, pks>::add_index
574 (
size_type i, const_sorted_iterator &it) {
576 if (first_node == ST_NIL)
581 if (dir == -1) nodes[it.index()].l = i;
else nodes[it.index()].r = i;
583 while(it.index() != ST_NIL) {
589 dir = it.direction();
592 case 0 : first_node = f;
break;
593 case -1 : nodes[it.index()].l = f;
break;
594 case +1 : nodes[it.index()].r = f;
break;
598 dir = it.direction();
604 template<
typename T,
typename COMP,
unsigned char pks>
606 dynamic_tree_sorted<T, COMP, pks>::add(
const T &f) {
607 const_sorted_iterator it(*
this); insert_path(f, it);
608 size_type num = dynamic_tas<T,pks>::add(f);
613 template<
typename T,
typename COMP,
unsigned char pks>
void
614 dynamic_tree_sorted<T, COMP, pks>::add_to_index(
size_type i,
const T &f) {
615 if (!(this->index_valid(i) && compar(f, (*
this)[i]) == 0)) {
616 if (this->index_valid(i)) sup(i);
617 dynamic_tas<T,pks>::add_to_index(i, f);
618 const_sorted_iterator it(*
this); insert_path(f, it);
623 template<
typename T,
typename COMP,
unsigned char pks>
625 dynamic_tree_sorted<T, COMP, pks>::add_norepeat
626 (
const T &f,
bool replace,
bool *present) {
627 const_sorted_iterator it(*
this); search_sorted_iterator(f, it);
630 if (present != NULL) *present =
false;
631 num = dynamic_tas<T,pks>::add(f); add_index(num, it);
634 if (present != NULL) *present =
true;
635 if (replace) (*this)[num] = f;
640 template<
typename T,
typename COMP,
unsigned char pks>
641 void dynamic_tree_sorted<T, COMP, pks>::resort(
void) {
642 const_tas_iterator itb
643 = ((
const dynamic_tree_sorted<T, COMP, pks> *)(
this))->tas_begin();
644 const_tas_iterator ite
645 = ((
const dynamic_tree_sorted<T, COMP, pks> *)(
this))->tas_end();
646 const_sorted_iterator it(*
this);
649 { insert_path(*itb, it); add_index(itb.index(), it); ++itb; }
652 template<
typename T,
typename COMP,
unsigned char pks>
653 void dynamic_tree_sorted<T, COMP, pks>::sup_index
654 (
size_type i, const_sorted_iterator &it) {
657 tree_elt *pni = &(nodes[i]), *pnc = 0;
659 if (pni->l == ST_NIL || pni->r == ST_NIL) {
660 f = (pni->l != ST_NIL) ? pni->l : pni->r;
661 dir = it.direction(); it.up(); ic = it.index();
662 if (ic != ST_NIL) pnc = &(nodes[ic]);
664 case 0 : first_node = f;
break;
665 case -1 : pnc->l = f;
break;
666 case +1 : pnc->r = f;
break;
671 dir = it.direction();
672 it--; ni = it.index();
674 case 0 : first_node = ni;
break;
675 case -1 : nodes[f].l = ni;
break;
676 case +1 : nodes[f].r = ni;
break;
678 pnc = &(nodes[ni]); f = pnc->l; *pnc = *pni;
679 dir = it.direction();
680 it.up(); ic = it.index();
if (ic == i) ic = ni; pnc = &(nodes[ic]);
681 if (dir == -1) pnc->l = f;
else pnc->r = f;
684 while (it.index() != ST_NIL) {
688 f = balance_again(ic);
690 dir = it.direction();
691 it.up(); ic = it.index();
if (ic == i) ic = ni;
692 if (ic != ST_NIL) pnc = &(nodes[ic]);
694 case 0 : first_node = f;
break;
695 case -1 : pnc->l = f;
break;
696 case +1 : pnc->r = f;
break;
702 template<
typename T,
typename COMP,
unsigned char pks>
703 void dynamic_tree_sorted<T, COMP, pks>::sup(
size_type i) {
704 GMM_ASSERT2(i < INT_MAX,
"out of range");
705 const_sorted_iterator it(*
this); find_sorted_iterator(i, it);
706 if (it.index() != ST_NIL)
707 { sup_index(i, it); dynamic_tas<T, pks>::sup(i); }
710 template<
typename T,
typename COMP,
unsigned char pks>
712 GMM_ASSERT2(i < INT_MAX && j < INT_MAX,
"out of range");
715 const_sorted_iterator it1(*
this), it2(*
this); it1.end(); it2.end();
717 if (this->index_valid(i)) find_sorted_iterator(i, it1);
718 if (this->index_valid(j)) find_sorted_iterator(j, it2);
720 short_type dir1 = it1.direction(), dir2 = it2.direction();
722 size_type f1 = it1.index(), f2 = it2.index();
724 if (f1!=ST_NIL) {
if (dir1==-1) nodes[f1].l = j;
else nodes[f1].r = j; }
725 if (f2!=ST_NIL) {
if (dir2==-1) nodes[f2].l = i;
else nodes[f2].r = i; }
726 if (first_node==i) first_node=j;
else if (first_node==j) first_node=i;
728 std::swap(nodes[i], nodes[j]);
729 dynamic_tas<T,pks>::swap(i,j);
738 template<
typename T,
typename TAB,
typename COMP>
struct less_index{
741 mutable const T *search_elt;
743 int operator()(
size_t i,
size_t j)
const {
744 return compare( (i == ST_NIL) ? *search_elt : (*tab)[i],
745 (j == ST_NIL) ? *search_elt : (*tab)[j] );
748 less_index(
const TAB &t,
const COMP &c)
749 { compare = c; tab = &t; }
755 template<
typename T,
typename TAB,
typename COMP = gmm::less<T>,
unsigned char pks = 5>
756 class dynamic_tree_sorted_index :
public
757 dynamic_tree_sorted<size_t, less_index<T,TAB,COMP>, pks> {
761 dynamic_tree_sorted<size_t, less_index<T,TAB,COMP>, pks>
::size_type
766 typedef dynamic_tree_sorted<size_t, less_index<T,TAB,COMP>, pks> dts_type;
770 dynamic_tree_sorted_index(TAB &t, COMP cp = COMP())
771 : dts_type(less_index<T,TAB,COMP>(t, cp)) { }
773 void change_tab(TAB &t, COMP cp = COMP())
774 { this->comparator() = less_index<T,TAB,COMP>(t, cp); }
777 this->compar.search_elt = &elt;
778 return dts_type::search(ST_NIL);
780 size_type search_ge(
const T &elt)
const {
781 this->compar.search_elt = &elt;
782 return dts_type::search_ge(ST_NIL);
785 typename dts_type::const_sorted_iterator it(*
this); (*this)[i] = i;
786 this->ind[i] =
true; insert_path(i, it); add_index(i, it);
return i;
iterator begin(void)
Iterator on the first element.
iterator end(void)
Iterator on the last + 1 element.
void copy(const L1 &l1, L2 &l2)
*/
void clear(L &l)
clear (fill with zeros) a vector or matrix.
void add(const L1 &l1, L2 &l2)
*/
gmm::uint16_type short_type
used as the common short type integer in the library
std::ostream & operator<<(std::ostream &o, const convex_structure &cv)
Print the details of the convex structure cvs to the output stream o.
size_t size_type
used as the common size type in the library