C Container Collection (CCC)
Loading...
Searching...
No Matches
private_doubly_linked_list.h
Go to the documentation of this file.
1
23#ifndef CCC_PRIVATE_DOUBLY_LINKED_LIST_H
24#define CCC_PRIVATE_DOUBLY_LINKED_LIST_H
25
27#include <stddef.h>
30#include "../types.h" /* IWYU pragma: keep */
31
32/* NOLINTBEGIN(readability-identifier-naming) */
33
44};
45
84};
85
86/*======================= Private Interface ===========================*/
87
91);
95);
98 struct CCC_Doubly_linked_list const *, void const *any_struct
99);
100
101/*======================= Macro Implementations =======================*/
102
105#define CCC_private_doubly_linked_list_for( \
106 private_struct_name, private_type_intruder_field \
107) \
108 (struct CCC_Doubly_linked_list) { \
109 .head = NULL, .tail = NULL, \
110 .sizeof_type = sizeof(private_struct_name), \
111 .alignof_type = alignof(private_struct_name), \
112 .type_intruder_offset \
113 = offsetof(private_struct_name, private_type_intruder_field), \
114 }
115
117#define CCC_private_doubly_linked_list_from( \
118 private_type_intruder_field, \
119 private_allocator, \
120 private_destructor, \
121 private_compound_literal_array... \
122) \
123 (struct { struct CCC_Doubly_linked_list private; }){(__extension__({ \
124 typeof(*private_compound_literal_array) \
125 *private_doubly_linked_list_type_array \
126 = private_compound_literal_array; \
127 struct CCC_Doubly_linked_list private_doubly_linked_list \
128 = CCC_private_doubly_linked_list_for( \
129 typeof(*private_doubly_linked_list_type_array), \
130 private_type_intruder_field \
131 ); \
132 CCC_Allocator const *const private_doubly_linked_list_allocator \
133 = &(private_allocator); \
134 if (private_doubly_linked_list_allocator->allocate) { \
135 size_t const private_count \
136 = sizeof(private_compound_literal_array) \
137 / sizeof(*private_doubly_linked_list_type_array); \
138 for (size_t private_i = 0; private_i < private_count; \
139 ++private_i) { \
140 typeof(*private_doubly_linked_list_type_array) *const \
141 private_new_node \
142 = private_doubly_linked_list_allocator->allocate( \
143 (CCC_Allocator_arguments){ \
144 .input = NULL, \
145 .bytes = private_doubly_linked_list.sizeof_type, \
146 .context \
147 = private_doubly_linked_list_allocator->context, \
148 } \
149 ); \
150 if (!private_new_node) { \
151 CCC_doubly_linked_list_clear( \
152 &private_doubly_linked_list, \
153 &private_destructor, \
154 private_doubly_linked_list_allocator \
155 ); \
156 break; \
157 } \
158 *private_new_node \
159 = private_doubly_linked_list_type_array[private_i]; \
160 CCC_private_doubly_linked_list_push_back( \
161 &private_doubly_linked_list, \
162 CCC_private_doubly_linked_list_node_in( \
163 &private_doubly_linked_list, private_new_node \
164 ) \
165 ); \
166 } \
167 } \
168 private_doubly_linked_list; \
169 }))}.private
170
172#define CCC_private_doubly_linked_list_emplace_back( \
173 doubly_linked_list_pointer, \
174 private_allocator_pointer, \
175 struct_initializer... \
176) \
177 (__extension__({ \
178 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
179 struct CCC_Doubly_linked_list *private_doubly_linked_list \
180 = (doubly_linked_list_pointer); \
181 CCC_Allocator const *const private_doubly_linked_list_allocator \
182 = (private_allocator_pointer); \
183 if (private_doubly_linked_list && private_doubly_linked_list_allocator \
184 && private_doubly_linked_list_allocator->allocate) { \
185 private_doubly_linked_list_res \
186 = private_doubly_linked_list_allocator->allocate(( \
187 CCC_Allocator_arguments \
188 ){ \
189 .input = NULL, \
190 .bytes = private_doubly_linked_list->sizeof_type, \
191 .alignment = private_doubly_linked_list->alignof_type, \
192 .context = private_doubly_linked_list_allocator->context, \
193 }); \
194 if (private_doubly_linked_list_res) { \
195 *private_doubly_linked_list_res = struct_initializer; \
196 CCC_private_doubly_linked_list_push_back( \
197 private_doubly_linked_list, \
198 CCC_private_doubly_linked_list_node_in( \
199 private_doubly_linked_list, \
200 private_doubly_linked_list_res \
201 ) \
202 ); \
203 } \
204 } \
205 private_doubly_linked_list_res; \
206 }))
207
209#define CCC_private_doubly_linked_list_emplace_front( \
210 doubly_linked_list_pointer, \
211 private_allocator_pointer, \
212 struct_initializer... \
213) \
214 (__extension__({ \
215 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
216 struct CCC_Doubly_linked_list *private_doubly_linked_list \
217 = (doubly_linked_list_pointer); \
218 CCC_Allocator const *const private_doubly_linked_list_allocator \
219 = (private_allocator_pointer); \
220 if (private_doubly_linked_list && private_doubly_linked_list_allocator \
221 && private_doubly_linked_list_allocator->allocate) { \
222 private_doubly_linked_list_res \
223 = private_doubly_linked_list_allocator->allocate(( \
224 CCC_Allocator_arguments \
225 ){ \
226 .input = NULL, \
227 .bytes = private_doubly_linked_list->sizeof_type, \
228 .alignment = private_doubly_linked_list->alignof_type, \
229 .context = private_doubly_linked_list_allocator->context, \
230 }); \
231 if (private_doubly_linked_list_res) { \
232 *private_doubly_linked_list_res = struct_initializer; \
233 CCC_private_doubly_linked_list_push_front( \
234 private_doubly_linked_list, \
235 CCC_private_doubly_linked_list_node_in( \
236 private_doubly_linked_list, \
237 private_doubly_linked_list_res \
238 ) \
239 ); \
240 } \
241 } \
242 private_doubly_linked_list_res; \
243 }))
244
245/* NOLINTEND(readability-identifier-naming) */
246
247#endif /* CCC_PRIVATE_DOUBLY_LINKED_LIST_H */
void CCC_private_doubly_linked_list_push_front(struct CCC_Doubly_linked_list *, struct CCC_Doubly_linked_list_node *)
struct CCC_Doubly_linked_list_node * CCC_private_doubly_linked_list_node_in(struct CCC_Doubly_linked_list const *, void const *any_struct)
void CCC_private_doubly_linked_list_push_back(struct CCC_Doubly_linked_list *, struct CCC_Doubly_linked_list_node *)
Definition: private_doubly_linked_list.h:39
struct CCC_Doubly_linked_list_node * previous
Definition: private_doubly_linked_list.h:43
struct CCC_Doubly_linked_list_node * next
Definition: private_doubly_linked_list.h:41
Definition: private_doubly_linked_list.h:73
size_t sizeof_type
Definition: private_doubly_linked_list.h:79
size_t alignof_type
Definition: private_doubly_linked_list.h:81
size_t type_intruder_offset
Definition: private_doubly_linked_list.h:83
struct CCC_Doubly_linked_list_node * head
Definition: private_doubly_linked_list.h:75
struct CCC_Doubly_linked_list_node * tail
Definition: private_doubly_linked_list.h:77