Make global.h global
[cacao.git] / src / 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 #ifndef CHAIN_H
16 #define CHAIN_H
17
18 typedef struct chainlink {          /* Struktur f"ur ein Listenelement */
19         struct chainlink *next,*prev;
20         void *element;
21         } chainlink;
22
23 typedef struct chain {              /* Struktur f"ur eine Liste */
24         int  usedump;   
25
26         chainlink *first,*last;
27         chainlink *active;
28         } chain;
29
30
31 chain *chain_new ();
32 chain *chain_dnew ();
33 void chain_free(chain *c);
34
35 void chain_addafter(chain *c, void *element);
36 void chain_addbefore(chain *c, void *element);
37 void chain_addlast (chain *c, void *element);
38 void chain_addfirst (chain *c, void *element);
39
40 void chain_remove(chain *c);
41 void *chain_remove_go_prev(chain *c);
42 void chain_removespecific(chain *c, void *element);
43
44 void *chain_next(chain *c);
45 void *chain_prev(chain *c);
46 void *chain_this(chain *c);
47
48 void *chain_first(chain *c);
49 void *chain_last(chain *c);
50
51
52 /*
53 --------------------------- Schnittstellenbeschreibung ------------------------
54
55 Bei Verwendung dieser Funktionen f"ur die Listenverwaltung mu"s, im
56 Gegenstatz zum Modul 'list', keine zus"atzliche Vorbereitung in den 
57 Element-Strukturen gemacht werden.
58
59 Diese Funktionen sind daher auch ein wenig langsamer und brauchen 
60 mehr Speicher.
61
62 Eine neue Liste wird mit 
63                   chain_new
64         oder  chain_dnew 
65 angelegt. Der Unterschied ist, da"s bei der zweiten Variante alle
66 zus"atzlichen Datenstrukturen am DUMP-Speicher angelegt werden (was
67 schneller geht, und ein explizites Freigeben am Ende der Verarbeitung
68 unn"otig macht). Dabei mu"s man aber achtgeben, da"s man nicht 
69 versehentlich Teile dieser Strukturen durch ein verfr"uhtes 'dump_release'
70 freigibt.
71
72 Eine nicht mehr verwendete Liste kann mit
73                 chain_free
74 freigegeben werden (nur verwenden, wenn mit 'chain_new' angefordert)
75
76
77 Das Eintragen neuer Elemente geht sehr einfach mit:
78         chain_addafter, chain_addlast, chain_addbefore, chain_addfirst          
79         
80 Durchsuchen der Liste mit:
81         chain_first, chain_last, chain_prev, chain_next, chain_this
82         
83 L"oschen von Elementen aus der Liste:
84         chain_remove, chain_remove_go_prev, chain_removespecific
85         
86         
87 ACHTUNG: In den zu verkettenden Elementen gibt es ja (wie oben gesagt) keine
88         Referenzen auf die Liste oder irgendwelche Listenknoten, deshalb k"onnen
89         die Elemente nicht als Ortsangabe innerhalb der Liste fungieren.
90         Es gibt vielmehr ein Art 'Cursor', der ein Element als das gerade
91         aktuelle festh"alt, und alle Ein-/und Ausf"ugeoperationen geschehen
92         relativ zu diesem Cursor.
93
94 */
95
96 #endif