16#ifndef CCC_PRIVATE_DOUBLY_LINKED_LIST_H
17#define CCC_PRIVATE_DOUBLY_LINKED_LIST_H
101 void const *any_struct);
107#define CCC_private_doubly_linked_list_initialize( \
108 private_struct_name, private_type_intruder_field, private_compare, \
109 private_allocate, private_context_data) \
113 .sizeof_type = sizeof(private_struct_name), \
114 .type_intruder_offset \
115 = offsetof(private_struct_name, private_type_intruder_field), \
117 .allocate = (private_allocate), \
118 .compare = (private_compare), \
119 .context = (private_context_data), \
123#define CCC_private_doubly_linked_list_with_allocator( \
124 private_struct_name, private_type_intruder_field, private_compare, \
129 .sizeof_type = sizeof(private_struct_name), \
130 .type_intruder_offset \
131 = offsetof(private_struct_name, private_type_intruder_field), \
133 .allocate = (private_allocate), \
134 .compare = (private_compare), \
139#define CCC_private_doubly_linked_list_with_context_allocator( \
140 private_struct_name, private_type_intruder_field, private_compare, \
141 private_allocate, private_context) \
145 .sizeof_type = sizeof(private_struct_name), \
146 .type_intruder_offset \
147 = offsetof(private_struct_name, private_type_intruder_field), \
149 .allocate = (private_allocate), \
150 .compare = (private_compare), \
151 .context = (private_context), \
155#define CCC_private_doubly_linked_list_from( \
156 private_type_intruder_field, private_compare, private_allocate, \
157 private_destroy, private_context_data, private_compound_literal_array...) \
159 typeof(*private_compound_literal_array) \
160 *private_doubly_linked_list_type_array \
161 = private_compound_literal_array; \
162 struct CCC_Doubly_linked_list private_doubly_linked_list \
163 = CCC_private_doubly_linked_list_initialize( \
164 typeof(*private_doubly_linked_list_type_array), \
165 private_type_intruder_field, private_compare, \
166 private_allocate, private_context_data); \
167 if (private_doubly_linked_list.allocate) \
169 size_t const private_count \
170 = sizeof(private_compound_literal_array) \
171 / sizeof(*private_doubly_linked_list_type_array); \
172 for (size_t private_i = 0; private_i < private_count; ++private_i) \
174 typeof(*private_doubly_linked_list_type_array) *const \
176 = private_doubly_linked_list.allocate( \
177 (CCC_Allocator_context){ \
179 .bytes = private_doubly_linked_list.sizeof_type, \
180 .context = private_doubly_linked_list.context, \
182 if (!private_new_node) \
184 CCC_doubly_linked_list_clear(&private_doubly_linked_list, \
189 = private_doubly_linked_list_type_array[private_i]; \
190 CCC_private_doubly_linked_list_push_back( \
191 &private_doubly_linked_list, \
192 CCC_private_doubly_linked_list_node_in( \
193 &private_doubly_linked_list, private_new_node)); \
196 private_doubly_linked_list; \
200#define CCC_private_doubly_linked_list_emplace_back( \
201 doubly_linked_list_pointer, struct_initializer...) \
203 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
204 struct CCC_Doubly_linked_list *private_doubly_linked_list \
205 = (doubly_linked_list_pointer); \
206 if (private_doubly_linked_list) \
208 if (private_doubly_linked_list->allocate) \
210 private_doubly_linked_list_res \
211 = private_doubly_linked_list->allocate( \
212 (CCC_Allocator_context){ \
214 .bytes = private_doubly_linked_list->sizeof_type, \
215 .context = private_doubly_linked_list->context, \
217 if (private_doubly_linked_list_res) \
219 *private_doubly_linked_list_res = struct_initializer; \
220 CCC_private_doubly_linked_list_push_back( \
221 private_doubly_linked_list, \
222 CCC_private_doubly_linked_list_node_in( \
223 private_doubly_linked_list, \
224 private_doubly_linked_list_res)); \
228 private_doubly_linked_list_res; \
232#define CCC_private_doubly_linked_list_emplace_front( \
233 doubly_linked_list_pointer, struct_initializer...) \
235 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
236 struct CCC_Doubly_linked_list *private_doubly_linked_list \
237 = (doubly_linked_list_pointer); \
238 if (!private_doubly_linked_list->allocate) \
240 private_doubly_linked_list_res = NULL; \
244 private_doubly_linked_list_res \
245 = private_doubly_linked_list->allocate( \
246 (CCC_Allocator_context){ \
248 .bytes = private_doubly_linked_list->sizeof_type, \
249 .context = private_doubly_linked_list->context, \
251 if (private_doubly_linked_list_res) \
253 *private_doubly_linked_list_res = struct_initializer; \
254 CCC_private_doubly_linked_list_push_front( \
255 private_doubly_linked_list, \
256 CCC_private_doubly_linked_list_node_in( \
257 private_doubly_linked_list, \
258 private_doubly_linked_list_res)); \
261 private_doubly_linked_list_res; \
Definition: private_doubly_linked_list.h:34
struct CCC_Doubly_linked_list_node * previous
Definition: private_doubly_linked_list.h:38
struct CCC_Doubly_linked_list_node * next
Definition: private_doubly_linked_list.h:36
Definition: private_doubly_linked_list.h:69
size_t sizeof_type
Definition: private_doubly_linked_list.h:77
CCC_Type_comparator * compare
Definition: private_doubly_linked_list.h:81
size_t type_intruder_offset
Definition: private_doubly_linked_list.h:79
struct CCC_Doubly_linked_list_node * head
Definition: private_doubly_linked_list.h:71
CCC_Allocator * allocate
Definition: private_doubly_linked_list.h:83
size_t count
Definition: private_doubly_linked_list.h:75
void * context
Definition: private_doubly_linked_list.h:85
struct CCC_Doubly_linked_list_node * tail
Definition: private_doubly_linked_list.h:73
CCC_Order CCC_Type_comparator(CCC_Type_comparator_context)
A callback function for comparing two elements in a container.
Definition: types.h:348
void * CCC_Allocator(CCC_Allocator_context)
An allocation function at the core of all containers.
Definition: types.h:340