1 | /* Abstract sequential list data type, with out-of-memory checking. |
2 | Copyright (C) 2009-2019 Free Software Foundation, Inc. |
3 | Written by Bruno Haible <bruno@clisp.org>, 2009. |
4 | |
5 | This program is free software: you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published by |
7 | the Free Software Foundation; either version 3 of the License, or |
8 | (at your option) any later version. |
9 | |
10 | This program is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | GNU General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU General Public License |
16 | along with this program. If not, see <https://www.gnu.org/licenses/>. */ |
17 | |
18 | #ifndef _GL_XLIST_H |
19 | #define _GL_XLIST_H |
20 | |
21 | #include "gl_list.h" |
22 | #include "xalloc.h" |
23 | |
24 | #ifndef _GL_INLINE_HEADER_BEGIN |
25 | #error "Please include config.h first." |
26 | #endif |
27 | _GL_INLINE_HEADER_BEGIN |
28 | #ifndef GL_XLIST_INLINE |
29 | # define GL_XLIST_INLINE _GL_INLINE |
30 | #endif |
31 | |
32 | #ifdef __cplusplus |
33 | extern "C" { |
34 | #endif |
35 | |
36 | /* These functions are thin wrappers around the corresponding functions with |
37 | _nx_ infix from gl_list.h. Upon out-of-memory, they invoke xalloc_die (), |
38 | instead of returning an error indicator. */ |
39 | #if 0 /* These are defined inline below. */ |
40 | extern gl_list_t gl_list_create_empty (gl_list_implementation_t implementation, |
41 | gl_listelement_equals_fn equals_fn, |
42 | gl_listelement_hashcode_fn hashcode_fn, |
43 | gl_listelement_dispose_fn dispose_fn, |
44 | bool allow_duplicates); |
45 | extern gl_list_t gl_list_create (gl_list_implementation_t implementation, |
46 | gl_listelement_equals_fn equals_fn, |
47 | gl_listelement_hashcode_fn hashcode_fn, |
48 | gl_listelement_dispose_fn dispose_fn, |
49 | bool allow_duplicates, |
50 | size_t count, const void **contents); |
51 | extern void gl_list_node_set_value (gl_list_t list, gl_list_node_t node, |
52 | const void *elt); |
53 | extern gl_list_node_t gl_list_set_at (gl_list_t list, size_t position, |
54 | const void *elt); |
55 | extern gl_list_node_t gl_list_add_first (gl_list_t list, const void *elt); |
56 | extern gl_list_node_t gl_list_add_last (gl_list_t list, const void *elt); |
57 | extern gl_list_node_t gl_list_add_before (gl_list_t list, gl_list_node_t node, |
58 | const void *elt); |
59 | extern gl_list_node_t gl_list_add_after (gl_list_t list, gl_list_node_t node, |
60 | const void *elt); |
61 | extern gl_list_node_t gl_list_add_at (gl_list_t list, size_t position, |
62 | const void *elt); |
63 | extern gl_list_node_t gl_sortedlist_add (gl_list_t list, |
64 | gl_listelement_compar_fn compar, |
65 | const void *elt); |
66 | #endif |
67 | |
68 | GL_XLIST_INLINE gl_list_t |
69 | gl_list_create_empty (gl_list_implementation_t implementation, |
70 | gl_listelement_equals_fn equals_fn, |
71 | gl_listelement_hashcode_fn hashcode_fn, |
72 | gl_listelement_dispose_fn dispose_fn, |
73 | bool allow_duplicates) |
74 | { |
75 | gl_list_t result = |
76 | gl_list_nx_create_empty (implementation, equals_fn, hashcode_fn, dispose_fn, |
77 | allow_duplicates); |
78 | if (result == NULL) |
79 | xalloc_die (); |
80 | return result; |
81 | } |
82 | |
83 | GL_XLIST_INLINE gl_list_t |
84 | gl_list_create (gl_list_implementation_t implementation, |
85 | gl_listelement_equals_fn equals_fn, |
86 | gl_listelement_hashcode_fn hashcode_fn, |
87 | gl_listelement_dispose_fn dispose_fn, |
88 | bool allow_duplicates, |
89 | size_t count, const void **contents) |
90 | { |
91 | gl_list_t result = |
92 | gl_list_nx_create (implementation, equals_fn, hashcode_fn, dispose_fn, |
93 | allow_duplicates, count, contents); |
94 | if (result == NULL) |
95 | xalloc_die (); |
96 | return result; |
97 | } |
98 | |
99 | GL_XLIST_INLINE void |
100 | gl_list_node_set_value (gl_list_t list, gl_list_node_t node, const void *elt) |
101 | { |
102 | int result = gl_list_node_nx_set_value (list, node, elt); |
103 | if (result < 0) |
104 | xalloc_die (); |
105 | } |
106 | |
107 | GL_XLIST_INLINE gl_list_node_t |
108 | gl_list_set_at (gl_list_t list, size_t position, const void *elt) |
109 | { |
110 | gl_list_node_t result = gl_list_nx_set_at (list, position, elt); |
111 | if (result == NULL) |
112 | xalloc_die (); |
113 | return result; |
114 | } |
115 | |
116 | GL_XLIST_INLINE gl_list_node_t |
117 | gl_list_add_first (gl_list_t list, const void *elt) |
118 | { |
119 | gl_list_node_t result = gl_list_nx_add_first (list, elt); |
120 | if (result == NULL) |
121 | xalloc_die (); |
122 | return result; |
123 | } |
124 | |
125 | GL_XLIST_INLINE gl_list_node_t |
126 | gl_list_add_last (gl_list_t list, const void *elt) |
127 | { |
128 | gl_list_node_t result = gl_list_nx_add_last (list, elt); |
129 | if (result == NULL) |
130 | xalloc_die (); |
131 | return result; |
132 | } |
133 | |
134 | GL_XLIST_INLINE gl_list_node_t |
135 | gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt) |
136 | { |
137 | gl_list_node_t result = gl_list_nx_add_before (list, node, elt); |
138 | if (result == NULL) |
139 | xalloc_die (); |
140 | return result; |
141 | } |
142 | |
143 | GL_XLIST_INLINE gl_list_node_t |
144 | gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt) |
145 | { |
146 | gl_list_node_t result = gl_list_nx_add_after (list, node, elt); |
147 | if (result == NULL) |
148 | xalloc_die (); |
149 | return result; |
150 | } |
151 | |
152 | GL_XLIST_INLINE gl_list_node_t |
153 | gl_list_add_at (gl_list_t list, size_t position, const void *elt) |
154 | { |
155 | gl_list_node_t result = gl_list_nx_add_at (list, position, elt); |
156 | if (result == NULL) |
157 | xalloc_die (); |
158 | return result; |
159 | } |
160 | |
161 | GL_XLIST_INLINE gl_list_node_t |
162 | gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar, |
163 | const void *elt) |
164 | { |
165 | gl_list_node_t result = gl_sortedlist_nx_add (list, compar, elt); |
166 | if (result == NULL) |
167 | xalloc_die (); |
168 | return result; |
169 | } |
170 | |
171 | #ifdef __cplusplus |
172 | } |
173 | #endif |
174 | |
175 | _GL_INLINE_HEADER_END |
176 | |
177 | #endif /* _GL_XLIST_H */ |
178 | |