224 ///Lift the item returned by highestActive() by one. |
224 ///Lift the item returned by highestActive() by one. |
225 /// |
225 /// |
226 void liftHighestActive() |
226 void liftHighestActive() |
227 { |
227 { |
228 Item it = *_last_active[_highest_active]; |
228 Item it = *_last_active[_highest_active]; |
229 _level.set(it,_level[it]+1); |
229 ++_level[it]; |
230 swap(_last_active[_highest_active]--,_last_active[_highest_active+1]); |
230 swap(_last_active[_highest_active]--,_last_active[_highest_active+1]); |
231 --_first[++_highest_active]; |
231 --_first[++_highest_active]; |
232 } |
232 } |
233 |
233 |
234 ///Lift the highest active item to the given level. |
234 ///Lift the highest active item to the given level. |
267 copy(--_first[l+1],_first[l]); |
267 copy(--_first[l+1],_first[l]); |
268 --_last_active[l]; |
268 --_last_active[l]; |
269 } |
269 } |
270 copy(li,_first[_max_level]); |
270 copy(li,_first[_max_level]); |
271 --_last_active[_max_level]; |
271 --_last_active[_max_level]; |
272 _level.set(li,_max_level); |
272 _level[li] = _max_level; |
273 |
273 |
274 while(_highest_active>=0 && |
274 while(_highest_active>=0 && |
275 _last_active[_highest_active]<_first[_highest_active]) |
275 _last_active[_highest_active]<_first[_highest_active]) |
276 _highest_active--; |
276 _highest_active--; |
277 } |
277 } |
297 ///Lift the active item returned by \ref activeOn() "activeOn(level)" |
297 ///Lift the active item returned by \ref activeOn() "activeOn(level)" |
298 ///by one. |
298 ///by one. |
299 Item liftActiveOn(int level) |
299 Item liftActiveOn(int level) |
300 { |
300 { |
301 Item it =*_last_active[level]; |
301 Item it =*_last_active[level]; |
302 _level.set(it,_level[it]+1); |
302 ++_level[it]; |
303 swap(_last_active[level]--, --_first[level+1]); |
303 swap(_last_active[level]--, --_first[level+1]); |
304 if (level+1>_highest_active) ++_highest_active; |
304 if (level+1>_highest_active) ++_highest_active; |
305 } |
305 } |
306 |
306 |
307 ///Lift the active item returned by \c activeOn(level) to the given level. |
307 ///Lift the active item returned by \c activeOn(level) to the given level. |
317 { |
317 { |
318 copy(_last_active[l],_first[l]); |
318 copy(_last_active[l],_first[l]); |
319 copy(--_first[l+1], _last_active[l]--); |
319 copy(--_first[l+1], _last_active[l]--); |
320 } |
320 } |
321 copy(ai,_first[new_level]); |
321 copy(ai,_first[new_level]); |
322 _level.set(ai,new_level); |
322 _level[ai] = new_level; |
323 if (new_level>_highest_active) _highest_active=new_level; |
323 if (new_level>_highest_active) _highest_active=new_level; |
324 } |
324 } |
325 |
325 |
326 ///Lift the active item returned by \c activeOn(level) to the top level. |
326 ///Lift the active item returned by \c activeOn(level) to the top level. |
327 |
327 |
337 copy(_last_active[l],_first[l]); |
337 copy(_last_active[l],_first[l]); |
338 copy(--_first[l+1], _last_active[l]--); |
338 copy(--_first[l+1], _last_active[l]--); |
339 } |
339 } |
340 copy(ai,_first[_max_level]); |
340 copy(ai,_first[_max_level]); |
341 --_last_active[_max_level]; |
341 --_last_active[_max_level]; |
342 _level.set(ai,_max_level); |
342 _level[ai] = _max_level; |
343 |
343 |
344 if (_highest_active==level) { |
344 if (_highest_active==level) { |
345 while(_highest_active>=0 && |
345 while(_highest_active>=0 && |
346 _last_active[_highest_active]<_first[_highest_active]) |
346 _last_active[_highest_active]<_first[_highest_active]) |
347 _highest_active--; |
347 _highest_active--; |
368 { |
368 { |
369 copy(_last_active[l],_first[l]); |
369 copy(_last_active[l],_first[l]); |
370 copy(--_first[l+1],_last_active[l]--); |
370 copy(--_first[l+1],_last_active[l]--); |
371 } |
371 } |
372 copy(i,_first[new_level]); |
372 copy(i,_first[new_level]); |
373 _level.set(i,new_level); |
373 _level[i] = new_level; |
374 if(new_level>_highest_active) _highest_active=new_level; |
374 if(new_level>_highest_active) _highest_active=new_level; |
375 } |
375 } |
376 |
376 |
377 ///Move an inactive item to the top but one level (in a dirty way). |
377 ///Move an inactive item to the top but one level (in a dirty way). |
378 |
378 |
380 ///but one level (in a dirty way). |
380 ///but one level (in a dirty way). |
381 ///\warning It makes the underlying datastructure corrupt, so use it |
381 ///\warning It makes the underlying datastructure corrupt, so use it |
382 ///only if you really know what it is for. |
382 ///only if you really know what it is for. |
383 ///\pre The item is on the top level. |
383 ///\pre The item is on the top level. |
384 void dirtyTopButOne(Item i) { |
384 void dirtyTopButOne(Item i) { |
385 _level.set(i,_max_level - 1); |
385 _level[i] = _max_level - 1; |
386 } |
386 } |
387 |
387 |
388 ///Lift all items on and above the given level to the top level. |
388 ///Lift all items on and above the given level to the top level. |
389 |
389 |
390 ///This function lifts all items on and above level \c l to the top |
390 ///This function lifts all items on and above level \c l to the top |
431 _last_active[0]=&_items[0]-1; |
431 _last_active[0]=&_items[0]-1; |
432 Vit n=&_items[0]; |
432 Vit n=&_items[0]; |
433 for(typename ItemSetTraits<GR,Item>::ItemIt i(_g);i!=INVALID;++i) |
433 for(typename ItemSetTraits<GR,Item>::ItemIt i(_g);i!=INVALID;++i) |
434 { |
434 { |
435 *n=i; |
435 *n=i; |
436 _where.set(i,n); |
436 _where[i] = n; |
437 _level.set(i,_max_level); |
437 _level[i] = _max_level; |
438 ++n; |
438 ++n; |
439 } |
439 } |
440 } |
440 } |
441 |
441 |
442 ///Add an item to the current level. |
442 ///Add an item to the current level. |
443 void initAddItem(Item i) |
443 void initAddItem(Item i) |
444 { |
444 { |
445 swap(_where[i],_init_num); |
445 swap(_where[i],_init_num); |
446 _level.set(i,_init_lev); |
446 _level[i] = _init_lev; |
447 ++_init_num; |
447 ++_init_num; |
448 } |
448 } |
449 |
449 |
450 ///Start a new level. |
450 ///Start a new level. |
451 |
451 |
549 ///Activate item \c i. |
549 ///Activate item \c i. |
550 |
550 |
551 ///Activate item \c i. |
551 ///Activate item \c i. |
552 ///\pre Item \c i shouldn't be active before. |
552 ///\pre Item \c i shouldn't be active before. |
553 void activate(Item i) { |
553 void activate(Item i) { |
554 _active.set(i, true); |
554 _active[i] = true; |
555 |
555 |
556 int level = _level[i]; |
556 int level = _level[i]; |
557 if (level > _highest_active) { |
557 if (level > _highest_active) { |
558 _highest_active = level; |
558 _highest_active = level; |
559 } |
559 } |
560 |
560 |
561 if (_prev[i] == INVALID || _active[_prev[i]]) return; |
561 if (_prev[i] == INVALID || _active[_prev[i]]) return; |
562 //unlace |
562 //unlace |
563 _next.set(_prev[i], _next[i]); |
563 _next[_prev[i]] = _next[i]; |
564 if (_next[i] != INVALID) { |
564 if (_next[i] != INVALID) { |
565 _prev.set(_next[i], _prev[i]); |
565 _prev[_next[i]] = _prev[i]; |
566 } else { |
566 } else { |
567 _last[level] = _prev[i]; |
567 _last[level] = _prev[i]; |
568 } |
568 } |
569 //lace |
569 //lace |
570 _next.set(i, _first[level]); |
570 _next[i] = _first[level]; |
571 _prev.set(_first[level], i); |
571 _prev[_first[level]] = i; |
572 _prev.set(i, INVALID); |
572 _prev[i] = INVALID; |
573 _first[level] = i; |
573 _first[level] = i; |
574 |
574 |
575 } |
575 } |
576 |
576 |
577 ///Deactivate item \c i. |
577 ///Deactivate item \c i. |
578 |
578 |
579 ///Deactivate item \c i. |
579 ///Deactivate item \c i. |
580 ///\pre Item \c i must be active before. |
580 ///\pre Item \c i must be active before. |
581 void deactivate(Item i) { |
581 void deactivate(Item i) { |
582 _active.set(i, false); |
582 _active[i] = false; |
583 int level = _level[i]; |
583 int level = _level[i]; |
584 |
584 |
585 if (_next[i] == INVALID || !_active[_next[i]]) |
585 if (_next[i] == INVALID || !_active[_next[i]]) |
586 goto find_highest_level; |
586 goto find_highest_level; |
587 |
587 |
588 //unlace |
588 //unlace |
589 _prev.set(_next[i], _prev[i]); |
589 _prev[_next[i]] = _prev[i]; |
590 if (_prev[i] != INVALID) { |
590 if (_prev[i] != INVALID) { |
591 _next.set(_prev[i], _next[i]); |
591 _next[_prev[i]] = _next[i]; |
592 } else { |
592 } else { |
593 _first[_level[i]] = _next[i]; |
593 _first[_level[i]] = _next[i]; |
594 } |
594 } |
595 //lace |
595 //lace |
596 _prev.set(i, _last[level]); |
596 _prev[i] = _last[level]; |
597 _next.set(_last[level], i); |
597 _next[_last[level]] = i; |
598 _next.set(i, INVALID); |
598 _next[i] = INVALID; |
599 _last[level] = i; |
599 _last[level] = i; |
600 |
600 |
601 find_highest_level: |
601 find_highest_level: |
602 if (level == _highest_active) { |
602 if (level == _highest_active) { |
603 while (_highest_active >= 0 && activeFree(_highest_active)) |
603 while (_highest_active >= 0 && activeFree(_highest_active)) |
683 ///Lift the item returned by highestActive() by one. |
683 ///Lift the item returned by highestActive() by one. |
684 /// |
684 /// |
685 void liftHighestActive() { |
685 void liftHighestActive() { |
686 Item i = _first[_highest_active]; |
686 Item i = _first[_highest_active]; |
687 if (_next[i] != INVALID) { |
687 if (_next[i] != INVALID) { |
688 _prev.set(_next[i], INVALID); |
688 _prev[_next[i]] = INVALID; |
689 _first[_highest_active] = _next[i]; |
689 _first[_highest_active] = _next[i]; |
690 } else { |
690 } else { |
691 _first[_highest_active] = INVALID; |
691 _first[_highest_active] = INVALID; |
692 _last[_highest_active] = INVALID; |
692 _last[_highest_active] = INVALID; |
693 } |
693 } |
694 _level.set(i, ++_highest_active); |
694 _level[i] = ++_highest_active; |
695 if (_first[_highest_active] == INVALID) { |
695 if (_first[_highest_active] == INVALID) { |
696 _first[_highest_active] = i; |
696 _first[_highest_active] = i; |
697 _last[_highest_active] = i; |
697 _last[_highest_active] = i; |
698 _prev.set(i, INVALID); |
698 _prev[i] = INVALID; |
699 _next.set(i, INVALID); |
699 _next[i] = INVALID; |
700 } else { |
700 } else { |
701 _prev.set(_first[_highest_active], i); |
701 _prev[_first[_highest_active]] = i; |
702 _next.set(i, _first[_highest_active]); |
702 _next[i] = _first[_highest_active]; |
703 _first[_highest_active] = i; |
703 _first[_highest_active] = i; |
704 } |
704 } |
705 } |
705 } |
706 |
706 |
707 ///Lift the highest active item to the given level. |
707 ///Lift the highest active item to the given level. |
712 ///than the current level. |
712 ///than the current level. |
713 /// |
713 /// |
714 void liftHighestActive(int new_level) { |
714 void liftHighestActive(int new_level) { |
715 Item i = _first[_highest_active]; |
715 Item i = _first[_highest_active]; |
716 if (_next[i] != INVALID) { |
716 if (_next[i] != INVALID) { |
717 _prev.set(_next[i], INVALID); |
717 _prev[_next[i]] = INVALID; |
718 _first[_highest_active] = _next[i]; |
718 _first[_highest_active] = _next[i]; |
719 } else { |
719 } else { |
720 _first[_highest_active] = INVALID; |
720 _first[_highest_active] = INVALID; |
721 _last[_highest_active] = INVALID; |
721 _last[_highest_active] = INVALID; |
722 } |
722 } |
723 _level.set(i, _highest_active = new_level); |
723 _level[i] = _highest_active = new_level; |
724 if (_first[_highest_active] == INVALID) { |
724 if (_first[_highest_active] == INVALID) { |
725 _first[_highest_active] = _last[_highest_active] = i; |
725 _first[_highest_active] = _last[_highest_active] = i; |
726 _prev.set(i, INVALID); |
726 _prev[i] = INVALID; |
727 _next.set(i, INVALID); |
727 _next[i] = INVALID; |
728 } else { |
728 } else { |
729 _prev.set(_first[_highest_active], i); |
729 _prev[_first[_highest_active]] = i; |
730 _next.set(i, _first[_highest_active]); |
730 _next[i] = _first[_highest_active]; |
731 _first[_highest_active] = i; |
731 _first[_highest_active] = i; |
732 } |
732 } |
733 } |
733 } |
734 |
734 |
735 ///Lift the highest active item to the top level. |
735 ///Lift the highest active item to the top level. |
736 |
736 |
737 ///Lift the item returned by highestActive() to the top level and |
737 ///Lift the item returned by highestActive() to the top level and |
738 ///deactivate it. |
738 ///deactivate it. |
739 void liftHighestActiveToTop() { |
739 void liftHighestActiveToTop() { |
740 Item i = _first[_highest_active]; |
740 Item i = _first[_highest_active]; |
741 _level.set(i, _max_level); |
741 _level[i] = _max_level; |
742 if (_next[i] != INVALID) { |
742 if (_next[i] != INVALID) { |
743 _prev.set(_next[i], INVALID); |
743 _prev[_next[i]] = INVALID; |
744 _first[_highest_active] = _next[i]; |
744 _first[_highest_active] = _next[i]; |
745 } else { |
745 } else { |
746 _first[_highest_active] = INVALID; |
746 _first[_highest_active] = INVALID; |
747 _last[_highest_active] = INVALID; |
747 _last[_highest_active] = INVALID; |
748 } |
748 } |
772 ///by one. |
772 ///by one. |
773 Item liftActiveOn(int l) |
773 Item liftActiveOn(int l) |
774 { |
774 { |
775 Item i = _first[l]; |
775 Item i = _first[l]; |
776 if (_next[i] != INVALID) { |
776 if (_next[i] != INVALID) { |
777 _prev.set(_next[i], INVALID); |
777 _prev[_next[i]] = INVALID; |
778 _first[l] = _next[i]; |
778 _first[l] = _next[i]; |
779 } else { |
779 } else { |
780 _first[l] = INVALID; |
780 _first[l] = INVALID; |
781 _last[l] = INVALID; |
781 _last[l] = INVALID; |
782 } |
782 } |
783 _level.set(i, ++l); |
783 _level[i] = ++l; |
784 if (_first[l] == INVALID) { |
784 if (_first[l] == INVALID) { |
785 _first[l] = _last[l] = i; |
785 _first[l] = _last[l] = i; |
786 _prev.set(i, INVALID); |
786 _prev[i] = INVALID; |
787 _next.set(i, INVALID); |
787 _next[i] = INVALID; |
788 } else { |
788 } else { |
789 _prev.set(_first[l], i); |
789 _prev[_first[l]] = i; |
790 _next.set(i, _first[l]); |
790 _next[i] = _first[l]; |
791 _first[l] = i; |
791 _first[l] = i; |
792 } |
792 } |
793 if (_highest_active < l) { |
793 if (_highest_active < l) { |
794 _highest_active = l; |
794 _highest_active = l; |
795 } |
795 } |
801 ///to the given level. |
801 ///to the given level. |
802 void liftActiveOn(int l, int new_level) |
802 void liftActiveOn(int l, int new_level) |
803 { |
803 { |
804 Item i = _first[l]; |
804 Item i = _first[l]; |
805 if (_next[i] != INVALID) { |
805 if (_next[i] != INVALID) { |
806 _prev.set(_next[i], INVALID); |
806 _prev[_next[i]] = INVALID; |
807 _first[l] = _next[i]; |
807 _first[l] = _next[i]; |
808 } else { |
808 } else { |
809 _first[l] = INVALID; |
809 _first[l] = INVALID; |
810 _last[l] = INVALID; |
810 _last[l] = INVALID; |
811 } |
811 } |
812 _level.set(i, l = new_level); |
812 _level[i] = l = new_level; |
813 if (_first[l] == INVALID) { |
813 if (_first[l] == INVALID) { |
814 _first[l] = _last[l] = i; |
814 _first[l] = _last[l] = i; |
815 _prev.set(i, INVALID); |
815 _prev[i] = INVALID; |
816 _next.set(i, INVALID); |
816 _next[i] = INVALID; |
817 } else { |
817 } else { |
818 _prev.set(_first[l], i); |
818 _prev[_first[l]] = i; |
819 _next.set(i, _first[l]); |
819 _next[i] = _first[l]; |
820 _first[l] = i; |
820 _first[l] = i; |
821 } |
821 } |
822 if (_highest_active < l) { |
822 if (_highest_active < l) { |
823 _highest_active = l; |
823 _highest_active = l; |
824 } |
824 } |
830 ///to the top level and deactivate it. |
830 ///to the top level and deactivate it. |
831 void liftActiveToTop(int l) |
831 void liftActiveToTop(int l) |
832 { |
832 { |
833 Item i = _first[l]; |
833 Item i = _first[l]; |
834 if (_next[i] != INVALID) { |
834 if (_next[i] != INVALID) { |
835 _prev.set(_next[i], INVALID); |
835 _prev[_next[i]] = INVALID; |
836 _first[l] = _next[i]; |
836 _first[l] = _next[i]; |
837 } else { |
837 } else { |
838 _first[l] = INVALID; |
838 _first[l] = INVALID; |
839 _last[l] = INVALID; |
839 _last[l] = INVALID; |
840 } |
840 } |
841 _level.set(i, _max_level); |
841 _level[i] = _max_level; |
842 if (l == _highest_active) { |
842 if (l == _highest_active) { |
843 while (_highest_active >= 0 && activeFree(_highest_active)) |
843 while (_highest_active >= 0 && activeFree(_highest_active)) |
844 --_highest_active; |
844 --_highest_active; |
845 } |
845 } |
846 } |
846 } |
854 /// \param new_level The new level of \c i. It must be strictly higher |
854 /// \param new_level The new level of \c i. It must be strictly higher |
855 /// than the current level. |
855 /// than the current level. |
856 /// |
856 /// |
857 void lift(Item i, int new_level) { |
857 void lift(Item i, int new_level) { |
858 if (_next[i] != INVALID) { |
858 if (_next[i] != INVALID) { |
859 _prev.set(_next[i], _prev[i]); |
859 _prev[_next[i]] = _prev[i]; |
860 } else { |
860 } else { |
861 _last[new_level] = _prev[i]; |
861 _last[new_level] = _prev[i]; |
862 } |
862 } |
863 if (_prev[i] != INVALID) { |
863 if (_prev[i] != INVALID) { |
864 _next.set(_prev[i], _next[i]); |
864 _next[_prev[i]] = _next[i]; |
865 } else { |
865 } else { |
866 _first[new_level] = _next[i]; |
866 _first[new_level] = _next[i]; |
867 } |
867 } |
868 _level.set(i, new_level); |
868 _level[i] = new_level; |
869 if (_first[new_level] == INVALID) { |
869 if (_first[new_level] == INVALID) { |
870 _first[new_level] = _last[new_level] = i; |
870 _first[new_level] = _last[new_level] = i; |
871 _prev.set(i, INVALID); |
871 _prev[i] = INVALID; |
872 _next.set(i, INVALID); |
872 _next[i] = INVALID; |
873 } else { |
873 } else { |
874 _prev.set(_first[new_level], i); |
874 _prev[_first[new_level]] = i; |
875 _next.set(i, _first[new_level]); |
875 _next[i] = _first[new_level]; |
876 _first[new_level] = i; |
876 _first[new_level] = i; |
877 } |
877 } |
878 if (_highest_active < new_level) { |
878 if (_highest_active < new_level) { |
879 _highest_active = new_level; |
879 _highest_active = new_level; |
880 } |
880 } |
886 ///but one level (in a dirty way). |
886 ///but one level (in a dirty way). |
887 ///\warning It makes the underlying datastructure corrupt, so use it |
887 ///\warning It makes the underlying datastructure corrupt, so use it |
888 ///only if you really know what it is for. |
888 ///only if you really know what it is for. |
889 ///\pre The item is on the top level. |
889 ///\pre The item is on the top level. |
890 void dirtyTopButOne(Item i) { |
890 void dirtyTopButOne(Item i) { |
891 _level.set(i, _max_level - 1); |
891 _level[i] = _max_level - 1; |
892 } |
892 } |
893 |
893 |
894 ///Lift all items on and above the given level to the top level. |
894 ///Lift all items on and above the given level to the top level. |
895 |
895 |
896 ///This function lifts all items on and above level \c l to the top |
896 ///This function lifts all items on and above level \c l to the top |
897 ///level and deactivates them. |
897 ///level and deactivates them. |
898 void liftToTop(int l) { |
898 void liftToTop(int l) { |
899 for (int i = l + 1; _first[i] != INVALID; ++i) { |
899 for (int i = l + 1; _first[i] != INVALID; ++i) { |
900 Item n = _first[i]; |
900 Item n = _first[i]; |
901 while (n != INVALID) { |
901 while (n != INVALID) { |
902 _level.set(n, _max_level); |
902 _level[n] = _max_level; |
903 n = _next[n]; |
903 n = _next[n]; |
904 } |
904 } |
905 _first[i] = INVALID; |
905 _first[i] = INVALID; |
906 _last[i] = INVALID; |
906 _last[i] = INVALID; |
907 } |
907 } |
935 _first[i] = _last[i] = INVALID; |
935 _first[i] = _last[i] = INVALID; |
936 } |
936 } |
937 _init_level = 0; |
937 _init_level = 0; |
938 for(typename ItemSetTraits<GR,Item>::ItemIt i(_graph); |
938 for(typename ItemSetTraits<GR,Item>::ItemIt i(_graph); |
939 i != INVALID; ++i) { |
939 i != INVALID; ++i) { |
940 _level.set(i, _max_level); |
940 _level[i] = _max_level; |
941 _active.set(i, false); |
941 _active[i] = false; |
942 } |
942 } |
943 } |
943 } |
944 |
944 |
945 ///Add an item to the current level. |
945 ///Add an item to the current level. |
946 void initAddItem(Item i) { |
946 void initAddItem(Item i) { |
947 _level.set(i, _init_level); |
947 _level[i] = _init_level; |
948 if (_last[_init_level] == INVALID) { |
948 if (_last[_init_level] == INVALID) { |
949 _first[_init_level] = i; |
949 _first[_init_level] = i; |
950 _last[_init_level] = i; |
950 _last[_init_level] = i; |
951 _prev.set(i, INVALID); |
951 _prev[i] = INVALID; |
952 _next.set(i, INVALID); |
952 _next[i] = INVALID; |
953 } else { |
953 } else { |
954 _prev.set(i, _last[_init_level]); |
954 _prev[i] = _last[_init_level]; |
955 _next.set(i, INVALID); |
955 _next[i] = INVALID; |
956 _next.set(_last[_init_level], i); |
956 _next[_last[_init_level]] = i; |
957 _last[_init_level] = i; |
957 _last[_init_level] = i; |
958 } |
958 } |
959 } |
959 } |
960 |
960 |
961 ///Start a new level. |
961 ///Start a new level. |