equal
deleted
inserted
replaced
298 |
298 |
299 void insert(const T &a, const T &comp) { |
299 void insert(const T &a, const T &comp) { |
300 |
300 |
301 IIter clit = _find(m[comp]); |
301 IIter clit = _find(m[comp]); |
302 ItemList &c = *clit->my_class; |
302 ItemList &c = *clit->my_class; |
303 c.push_back(ItemType(a,0)); |
303 c.push_back(ItemType(a,CIter())); |
304 IIter ai = c.end(); |
304 IIter ai = c.end(); |
305 --ai; |
305 --ai; |
306 ai->parent = clit; |
306 ai->parent = clit; |
307 m.set(a, ai); |
307 m.set(a, ai); |
308 ++clit->size; |
308 ++clit->size; |
345 |
345 |
346 ItemList &alist = *ca->my_class; |
346 ItemList &alist = *ca->my_class; |
347 alist.splice(alist.end(),*cb->my_class); |
347 alist.splice(alist.end(),*cb->my_class); |
348 |
348 |
349 classes.erase(cb->my_class); |
349 classes.erase(cb->my_class); |
350 // ehem: cb->my_class = 0; |
|
351 } |
350 } |
352 else { |
351 else { |
353 |
352 |
354 ca->parent = cb->parent; |
353 ca->parent = cb->parent; |
355 cb->size += ca->size; |
354 cb->size += ca->size; |
356 |
355 |
357 ItemList &blist = *cb->my_class; |
356 ItemList &blist = *cb->my_class; |
358 blist.splice(blist.end(),*ca->my_class); |
357 blist.splice(blist.end(),*ca->my_class); |
359 |
358 |
360 classes.erase(ca->my_class); |
359 classes.erase(ca->my_class); |
361 // ehem: ca->my_class = 0; |
|
362 } |
360 } |
363 |
361 |
364 return true; |
362 return true; |
365 } |
363 } |
366 |
364 |
418 IIter ia = m[a]; |
416 IIter ia = m[a]; |
419 IIter la = _find(ia); |
417 IIter la = _find(ia); |
420 if (la == ia) return; |
418 if (la == ia) return; |
421 |
419 |
422 ia->my_class = la->my_class; |
420 ia->my_class = la->my_class; |
423 // ehem: la->my_class = 0; |
|
424 |
421 |
425 ia->size = la->size; |
422 ia->size = la->size; |
426 |
423 |
427 CIter l = ia->my_class; |
424 CIter l = ia->my_class; |
428 l->splice(l->begin(),*l,ia); |
425 l->splice(l->begin(),*l,ia); |
476 i->parent = lai; |
473 i->parent = lai; |
477 --lai->size; |
474 --lai->size; |
478 } |
475 } |
479 |
476 |
480 ai->parent = clit; |
477 ai->parent = clit; |
481 // ehem: ai->my_class = 0; |
|
482 ++clit->size; |
478 ++clit->size; |
483 |
479 |
484 return true; |
480 return true; |
485 } |
481 } |
486 |
482 |
494 * It is an error to remove an element which is not in the structure. |
490 * It is an error to remove an element which is not in the structure. |
495 */ |
491 */ |
496 void erase(const T &a) { |
492 void erase(const T &a) { |
497 |
493 |
498 IIter ma = m[a]; |
494 IIter ma = m[a]; |
499 // ehem: if (ma == 0) return; |
|
500 |
495 |
501 IIter la = _find(ma); |
496 IIter la = _find(ma); |
502 if (la == ma) { |
497 if (la == ma) { |
503 if (ma -> size == 1){ |
498 if (ma -> size == 1){ |
504 classes.erase(ma->my_class); |
499 classes.erase(ma->my_class); |
505 // ehem: m.set(a,0); |
|
506 return; |
500 return; |
507 } |
501 } |
508 ++la; |
502 ++la; |
509 la->size = ma->size; |
503 la->size = ma->size; |
510 la->my_class = ma->my_class; |
504 la->my_class = ma->my_class; |
514 i->parent = la; |
508 i->parent = la; |
515 } |
509 } |
516 |
510 |
517 la->size--; |
511 la->size--; |
518 la->my_class->erase(ma); |
512 la->my_class->erase(ma); |
519 // ehem: m.set(a,0); |
|
520 } |
513 } |
521 |
514 |
522 /** |
515 /** |
523 * \brief Removes the component of the given element from the structure. |
516 * \brief Removes the component of the given element from the structure. |
524 * |
517 * |
527 * It is an error to give an element which is not in the structure. |
520 * It is an error to give an element which is not in the structure. |
528 */ |
521 */ |
529 |
522 |
530 void eraseClass(const T &a) { |
523 void eraseClass(const T &a) { |
531 IIter ma = m[a]; |
524 IIter ma = m[a]; |
532 // ehem: if (ma == 0) return; |
|
533 // # ifdef DEBUG |
|
534 // CIter c = _find(ma)->my_class; |
|
535 // for (IIter i=c->begin(); i!=c->end(); ++i) |
|
536 // m.set(i->me, 0); |
|
537 // # endif |
|
538 classes.erase(_find(ma)->my_class); |
525 classes.erase(_find(ma)->my_class); |
539 } |
526 } |
540 |
527 |
541 |
528 |
542 class ClassIt { |
529 class ClassIt { |
579 return *this; |
566 return *this; |
580 } |
567 } |
581 |
568 |
582 // obsoleted: |
569 // obsoleted: |
583 bool valid() const { return l!=0 && i!=l->end(); } |
570 bool valid() const { return l!=0 && i!=l->end(); } |
584 private: |
|
585 //void first(const ClassList &l) { i = l.begin(); validate(l); } |
|
586 // void next(const ClassList &l) { |
|
587 // ++i; |
|
588 // validate(l); |
|
589 // } |
|
590 // void validate(const ClassList &l) { |
|
591 // if ( i == l.end() ) |
|
592 // i = 0; |
|
593 // } |
|
594 }; |
571 }; |
595 |
572 |
596 /** |
573 /** |
597 * \brief Sets the iterator to point to the first component. |
574 * \brief Sets the iterator to point to the first component. |
598 * |
575 * |
659 l = &ufe.classOf(a); |
636 l = &ufe.classOf(a); |
660 i = l->begin(); |
637 i = l->begin(); |
661 } |
638 } |
662 |
639 |
663 operator const T& () const { return i->me; } |
640 operator const T& () const { return i->me; } |
664 bool operator == (ItemIt it) const { |
641 bool operator == (ItemIt const &it) const { |
665 return (l==it.l && i==it.i) || (!valid() && !it.valid()); |
642 return (l==it.l && i==it.i) || (!valid() && !it.valid()); |
666 } |
643 } |
667 bool operator != (ItemIt it) const { |
644 bool operator != (ItemIt const &it) const { |
668 return !(*this == it); |
645 return !(*this == it); |
669 } |
646 } |
670 bool operator < (ItemIt it) const { |
647 bool operator < (ItemIt const &it) const { |
671 return (i < it.i); |
648 return (i < it.i); |
672 } |
649 } |
673 |
650 |
674 bool operator==(Invalid) const { |
651 bool operator==(Invalid) const { |
675 return !valid(); |
652 return !valid(); |
683 return *this; |
660 return *this; |
684 } |
661 } |
685 |
662 |
686 // obsoleted: |
663 // obsoleted: |
687 bool valid() const { return l!=0 && i!=l->end(); } |
664 bool valid() const { return l!=0 && i!=l->end(); } |
688 private: |
|
689 // void first(const ItemList &il) { l=&il; i = l->begin(); validate(); } |
|
690 // void next() { |
|
691 // ++i; |
|
692 // validate(); |
|
693 // } |
|
694 // void validate() { |
|
695 // if ( i == l->end() ) |
|
696 // i = 0; |
|
697 // } |
|
698 }; |
665 }; |
699 |
666 |
700 |
667 |
701 |
668 |
702 /** |
669 /** |