23#ifndef CCC_PRIVATE_DOUBLY_LINKED_LIST_H
24#define CCC_PRIVATE_DOUBLY_LINKED_LIST_H
105#define CCC_private_doubly_linked_list_for( \
106 private_struct_name, private_type_intruder_field \
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), \
117#define CCC_private_doubly_linked_list_from( \
118 private_type_intruder_field, \
120 private_destructor, \
121 private_compound_literal_array... \
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 \
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; \
140 typeof(*private_doubly_linked_list_type_array) *const \
142 = private_doubly_linked_list_allocator->allocate( \
143 (CCC_Allocator_arguments){ \
145 .bytes = private_doubly_linked_list.sizeof_type, \
147 = private_doubly_linked_list_allocator->context, \
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 \
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 \
168 private_doubly_linked_list; \
172#define CCC_private_doubly_linked_list_emplace_back( \
173 doubly_linked_list_pointer, \
174 private_allocator_pointer, \
175 struct_initializer... \
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 \
190 .bytes = private_doubly_linked_list->sizeof_type, \
191 .alignment = private_doubly_linked_list->alignof_type, \
192 .context = private_doubly_linked_list_allocator->context, \
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 \
205 private_doubly_linked_list_res; \
209#define CCC_private_doubly_linked_list_emplace_front( \
210 doubly_linked_list_pointer, \
211 private_allocator_pointer, \
212 struct_initializer... \
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 \
227 .bytes = private_doubly_linked_list->sizeof_type, \
228 .alignment = private_doubly_linked_list->alignof_type, \
229 .context = private_doubly_linked_list_allocator->context, \
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 \
242 private_doubly_linked_list_res; \
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