Initial revision
[cacao.git] / toolbox / chain.h
1 /************************* toolbox/chain.h *************************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         dient zur Verwaltung doppelt verketteter Listen mit externer Verkettung
8
9         Authors: Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
10
11         Last Change: 1996/10/03
12
13 *******************************************************************************/
14
15 typedef struct chainlink {          /* Struktur f"ur ein Listenelement */
16         struct chainlink *next,*prev;
17         void *element;
18         } chainlink;
19
20 typedef struct chain {              /* Struktur f"ur eine Liste */
21         int  usedump;   
22
23         chainlink *first,*last;
24         chainlink *active;
25         } chain;
26
27
28 chain *chain_new ();
29 chain *chain_dnew ();
30 void chain_free(chain *c);
31
32 void chain_addafter(chain *c, void *element);
33 void chain_addbefore(chain *c, void *element);
34 void chain_addlast (chain *c, void *element);
35 void chain_addfirst (chain *c, void *element);
36
37 void chain_remove(chain *c);
38 void *chain_remove_go_prev(chain *c);
39 void chain_removespecific(chain *c, void *element);
40
41 void *chain_next(chain *c);
42 void *chain_prev(chain *c);
43 void *chain_this(chain *c);
44
45 void *chain_first(chain *c);
46 void *chain_last(chain *c);
47
48
49 /*
50 --------------------------- Schnittstellenbeschreibung ------------------------
51
52 Bei Verwendung dieser Funktionen f"ur die Listenverwaltung mu"s, im
53 Gegenstatz zum Modul 'list', keine zus"atzliche Vorbereitung in den 
54 Element-Strukturen gemacht werden.
55
56 Diese Funktionen sind daher auch ein wenig langsamer und brauchen 
57 mehr Speicher.
58
59 Eine neue Liste wird mit 
60                   chain_new
61         oder  chain_dnew 
62 angelegt. Der Unterschied ist, da"s bei der zweiten Variante alle
63 zus"atzlichen Datenstrukturen am DUMP-Speicher angelegt werden (was
64 schneller geht, und ein explizites Freigeben am Ende der Verarbeitung
65 unn"otig macht). Dabei mu"s man aber achtgeben, da"s man nicht 
66 versehentlich Teile dieser Strukturen durch ein verfr"uhtes 'dump_release'
67 freigibt.
68
69 Eine nicht mehr verwendete Liste kann mit
70                 chain_free
71 freigegeben werden (nur verwenden, wenn mit 'chain_new' angefordert)
72
73
74 Das Eintragen neuer Elemente geht sehr einfach mit:
75         chain_addafter, chain_addlast, chain_addbefore, chain_addfirst          
76         
77 Durchsuchen der Liste mit:
78         chain_first, chain_last, chain_prev, chain_next, chain_this
79         
80 L"oschen von Elementen aus der Liste:
81         chain_remove, chain_remove_go_prev, chain_removespecific
82         
83         
84 ACHTUNG: In den zu verkettenden Elementen gibt es ja (wie oben gesagt) keine
85         Referenzen auf die Liste oder irgendwelche Listenknoten, deshalb k"onnen
86         die Elemente nicht als Ortsangabe innerhalb der Liste fungieren.
87         Es gibt vielmehr ein Art 'Cursor', der ein Element als das gerade
88         aktuelle festh"alt, und alle Ein-/und Ausf"ugeoperationen geschehen
89         relativ zu diesem Cursor.
90
91 */
92