X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Flinklist.h;h=cacceae67dea9f7bcbef7e8612e316fe6216a819;hb=6c6367a007ab0f67538ad165e5815e66183a3997;hp=0c580defded3c95b8ff8836fbdf562c98ebd9792;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/guicast/linklist.h b/cinelerra-5.1/guicast/linklist.h index 0c580def..cacceae6 100644 --- a/cinelerra-5.1/guicast/linklist.h +++ b/cinelerra-5.1/guicast/linklist.h @@ -1,3 +1,24 @@ +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + + #ifndef LINKLIST_H #define LINKLIST_H @@ -9,9 +30,9 @@ public: TYPE *previous, *next; List *list; - int get_item_number() { return !list ? -1 : list->number_of(this); } + int get_item_number() { return !list ? -1 : list->number_of((TYPE*)this); } ListItem() { list = 0; previous = next = 0; } - ListItem(List &me) { list = me; previous = next = 0; } + ListItem(List *me) { list = me; previous = next = 0; } virtual ~ListItem() { if( list ) list->remove_pointer(this); } }; @@ -28,6 +49,7 @@ public: void remove_pointer(ListItem *item); TYPE *append(TYPE *new_item); TYPE *append() { return append(new TYPE()); } + void destroy() { while(last) delete last; } TYPE *insert_before(TYPE *here, TYPE *item); TYPE *insert_before(TYPE *here) { return insert_before(here, new TYPE()); } TYPE *insert_after(TYPE *here, TYPE *item); @@ -45,8 +67,9 @@ public: void swap(TYPE *item1, TYPE *item2); void sort(TYPE *ap=0, TYPE *bp=0) { return sort(cmpr,ap,bp); } void sort(int (*cmp)(TYPE *a, TYPE *b), TYPE *ap=0, TYPE *bp=0); + void concat(List &b); List() { first = last = 0; } - virtual ~List() { while(last) delete last; } + virtual ~List() { destroy(); } }; // convenience macros @@ -132,4 +155,14 @@ void List::sort(int (*cmpr)(TYPE *a, TYPE *b), TYPE *ll, TYPE *rr) } } +template +void List::concat(List &b) +{ + if( !b.first ) return; + *(last ? &last->next : &first) = b.first; + b.first->previous = last; last = b.last; + TYPE *bp = b.first; b.first = b.last = 0; + while( bp ) { bp->list = this; bp = bp->next; } +} + #endif