annotate lib/gl_set.h @ 40196:e63f5d3edab5

relocatable-prog: Update documentation. * doc/relocatable-maint.texi (Supporting Relocation): Update to match the recent changes.
author Bruno Haible <bruno@clisp.org>
date Sun, 24 Feb 2019 01:49:15 +0100
parents b06060465f09
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39991
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Abstract set data type.
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 39999
diff changeset
2 Copyright (C) 2006-2007, 2009-2019 Free Software Foundation, Inc.
39991
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <bruno@clisp.org>, 2018.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 (at your option) any later version.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18 #ifndef _GL_SET_H
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #define _GL_SET_H
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 #include <stdbool.h>
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include <stddef.h>
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #ifndef _GL_INLINE_HEADER_BEGIN
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #error "Please include config.h first."
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 _GL_INLINE_HEADER_BEGIN
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 #ifndef GL_SET_INLINE
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 # define GL_SET_INLINE _GL_INLINE
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 #ifdef __cplusplus
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 extern "C" {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 /* gl_set is an abstract set data type. It can contain any number of objects
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 ('void *' or 'const void *' pointers); the order does not matter.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 Duplicates (in the sense of the comparator) are forbidden.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 There are several implementations of this set datatype, optimized for
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 different operations or for memory. You can start using the simplest set
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 implementation, GL_ARRAY_SET, and switch to a different implementation
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 later, when you realize which operations are performed the most frequently.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 The API of the different implementations is exactly the same; when switching
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 to a different implementation, you only have to change the gl_set_create
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 call.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 The implementations are:
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 GL_ARRAY_SET a growable array
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 GL_LINKEDHASH_SET a hash table with a linked list
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 GL_HASH_SET a hash table
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 The memory consumption is asymptotically the same: O(1) for every object
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 in the set. When looking more closely at the average memory consumed
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 for an object, GL_ARRAY_SET is the most compact representation, then comes
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 GL_HASH_SET, and GL_LINKEDHASH_SET needs the most memory.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 The guaranteed average performance of the operations is, for a set of
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 n elements:
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 Operation ARRAY LINKEDHASH
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63 HASH
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 gl_set_size O(1) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 gl_set_add O(n) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 gl_set_remove O(n) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 gl_set_search O(n) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 gl_set_iterator O(1) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 gl_set_iterator_next O(1) O(1)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 /* --------------------------- gl_set_t Data Type --------------------------- */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 /* Type of function used to compare two elements.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 NULL denotes pointer comparison. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 typedef bool (*gl_setelement_equals_fn) (const void *elt1, const void *elt2);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 /* Type of function used to compute a hash code.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 NULL denotes a function that depends only on the pointer itself. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81 typedef size_t (*gl_setelement_hashcode_fn) (const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 #ifndef _GL_SETELEMENT_DISPOSE_FN_DEFINED
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 /* Type of function used to dispose an element once it's removed from a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 NULL denotes a no-op. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 typedef void (*gl_setelement_dispose_fn) (const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 # define _GL_SETELEMENT_DISPOSE_FN_DEFINED 1
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 struct gl_set_impl;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 /* Type representing an entire set. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 typedef struct gl_set_impl * gl_set_t;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 struct gl_set_implementation;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 /* Type representing a set datatype implementation. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 typedef const struct gl_set_implementation * gl_set_implementation_t;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 #if 0 /* Unless otherwise specified, these are defined inline below. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 /* Create an empty set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 IMPLEMENTATION is one of GL_ARRAY_SET, GL_LINKEDHASH_SET, GL_HASH_SET.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 EQUALS_FN is an element comparison function or NULL.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 HASHCODE_FN is an element hash code function or NULL.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 DISPOSE_FN is an element disposal function or NULL. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 /* declared in gl_xset.h */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 extern gl_set_t gl_set_create_empty (gl_set_implementation_t implementation,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 gl_setelement_equals_fn equals_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 gl_setelement_hashcode_fn hashcode_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 gl_setelement_dispose_fn dispose_fn);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 /* Likewise. Return NULL upon out-of-memory. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 extern gl_set_t gl_set_nx_create_empty (gl_set_implementation_t implementation,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 gl_setelement_equals_fn equals_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 gl_setelement_hashcode_fn hashcode_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 gl_setelement_dispose_fn dispose_fn);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 /* Return the current number of elements in a set. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 extern size_t gl_set_size (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 /* Search whether an element is already in the set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 Return true if found, or false if not present in the set. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 extern bool gl_set_search (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 /* Add an element to a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 Return true if it was not already in the set and added, false otherwise. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 /* declared in gl_xset.h */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 extern bool gl_set_add (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 /* Likewise. Return -1 upon out-of-memory. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128 extern int gl_set_nx_add (gl_set_t set, const void *elt)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 __attribute__ ((__warn_unused_result__))
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 ;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134 /* Remove an element from a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 Return true if it was found and removed. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136 extern bool gl_set_remove (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 /* Free an entire set.
39999
d8b00b7465aa Fix comments.
Bruno Haible <bruno@clisp.org>
parents: 39991
diff changeset
139 (But this call does not free the elements of the set. It only invokes
d8b00b7465aa Fix comments.
Bruno Haible <bruno@clisp.org>
parents: 39991
diff changeset
140 the DISPOSE_FN on each of the elements of the set.) */
39991
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
141 extern void gl_set_free (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
142
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
143 #endif /* End of inline and gl_xset.h-defined functions. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
144
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
145 /* ---------------------- gl_set_iterator_t Data Type ---------------------- */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
146
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
147 /* Functions for iterating through a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
148 Note: Iterating through a set of type GL_HASH_SET returns the elements in an
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
149 unpredictable order. If you need a predictable order, use GL_LINKEDHASH_SET
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
150 instead of GL_HASH_SET. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
151
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
152 /* Type of an iterator that traverses a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
153 This is a fixed-size struct, so that creation of an iterator doesn't need
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
154 memory allocation on the heap. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
155 typedef struct
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
156 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
157 /* For fast dispatch of gl_set_iterator_next. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
158 const struct gl_set_implementation *vtable;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
159 /* For detecting whether the last returned element was removed. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
160 gl_set_t set;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
161 size_t count;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
162 /* Other, implementation-private fields. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
163 void *p; void *q;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
164 size_t i; size_t j;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
165 } gl_set_iterator_t;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
166
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
167 #if 0 /* These are defined inline below. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
168
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
169 /* Create an iterator traversing a set.
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
170 The set's contents must not be modified while the iterator is in use,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
171 except for removing the last returned element. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
172 extern gl_set_iterator_t gl_set_iterator (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
173
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
174 /* If there is a next element, store the next element in *ELTP, advance the
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
175 iterator and return true. Otherwise, return false. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
176 extern bool gl_set_iterator_next (gl_set_iterator_t *iterator,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
177 const void **eltp);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
178
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
179 /* Free an iterator. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
180 extern void gl_set_iterator_free (gl_set_iterator_t *iterator);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
181
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
182 #endif /* End of inline functions. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
183
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
184 /* ------------------------ Implementation Details ------------------------ */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
185
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
186 struct gl_set_implementation
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
187 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
188 /* gl_set_t functions. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
189 gl_set_t (*nx_create_empty) (gl_set_implementation_t implementation,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
190 gl_setelement_equals_fn equals_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
191 gl_setelement_hashcode_fn hashcode_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
192 gl_setelement_dispose_fn dispose_fn);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
193 size_t (*size) (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
194 bool (*search) (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
195 int (*nx_add) (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
196 bool (*remove_elt) (gl_set_t set, const void *elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
197 void (*set_free) (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
198 /* gl_set_iterator_t functions. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
199 gl_set_iterator_t (*iterator) (gl_set_t set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
200 bool (*iterator_next) (gl_set_iterator_t *iterator, const void **eltp);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
201 void (*iterator_free) (gl_set_iterator_t *iterator);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
202 };
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
203
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
204 struct gl_set_impl_base
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
205 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
206 const struct gl_set_implementation *vtable;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
207 gl_setelement_equals_fn equals_fn;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
208 gl_setelement_dispose_fn dispose_fn;
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
209 };
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
210
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
211 /* Define all functions of this file as accesses to the
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
212 struct gl_set_implementation. */
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
213
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
214 GL_SET_INLINE gl_set_t
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
215 gl_set_nx_create_empty (gl_set_implementation_t implementation,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
216 gl_setelement_equals_fn equals_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
217 gl_setelement_hashcode_fn hashcode_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
218 gl_setelement_dispose_fn dispose_fn)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
219 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
220 return implementation->nx_create_empty (implementation, equals_fn,
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
221 hashcode_fn, dispose_fn);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
222 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
223
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
224 GL_SET_INLINE size_t
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
225 gl_set_size (gl_set_t set)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
226 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
227 return ((const struct gl_set_impl_base *) set)->vtable->size (set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
228 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
229
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
230 GL_SET_INLINE bool
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
231 gl_set_search (gl_set_t set, const void *elt)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
232 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
233 return ((const struct gl_set_impl_base *) set)->vtable->search (set, elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
234 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
235
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
236 GL_SET_INLINE int
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
237 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
238 __attribute__ ((__warn_unused_result__))
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
239 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
240 gl_set_nx_add (gl_set_t set, const void *elt)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
241 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
242 return ((const struct gl_set_impl_base *) set)->vtable->nx_add (set, elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
243 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
244
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
245 GL_SET_INLINE bool
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
246 gl_set_remove (gl_set_t set, const void *elt)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
247 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
248 return ((const struct gl_set_impl_base *) set)->vtable->remove_elt (set, elt);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
249 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
250
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
251 GL_SET_INLINE void
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
252 gl_set_free (gl_set_t set)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
253 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
254 ((const struct gl_set_impl_base *) set)->vtable->set_free (set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
255 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
256
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
257 GL_SET_INLINE gl_set_iterator_t
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
258 gl_set_iterator (gl_set_t set)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
259 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
260 return ((const struct gl_set_impl_base *) set)->vtable->iterator (set);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
261 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
262
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
263 GL_SET_INLINE bool
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
264 gl_set_iterator_next (gl_set_iterator_t *iterator, const void **eltp)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
265 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
266 return iterator->vtable->iterator_next (iterator, eltp);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
267 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
268
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
269 GL_SET_INLINE void
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
270 gl_set_iterator_free (gl_set_iterator_t *iterator)
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
271 {
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
272 iterator->vtable->iterator_free (iterator);
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
273 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
274
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
275 #ifdef __cplusplus
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
276 }
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
277 #endif
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
278
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
279 _GL_INLINE_HEADER_END
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
280
0737850e370b set: New module.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
281 #endif /* _GL_SET_H */