16#ifndef CCC_PRIVATE_DOUBLY_LINKED_LIST_H
17#define CCC_PRIVATE_DOUBLY_LINKED_LIST_H
80void CCC_private_doubly_linked_list_push_back(
84void CCC_private_doubly_linked_list_push_front(
96#define CCC_private_doubly_linked_list_for( \
97 private_struct_name, private_type_intruder_field \
99 (struct CCC_Doubly_linked_list) { \
100 .head = NULL, .tail = NULL, \
101 .sizeof_type = sizeof(private_struct_name), \
102 .type_intruder_offset \
103 = offsetof(private_struct_name, private_type_intruder_field), \
107#define CCC_private_doubly_linked_list_from( \
108 private_type_intruder_field, \
110 private_destructor, \
111 private_compound_literal_array... \
113 (struct { struct CCC_Doubly_linked_list private; }){(__extension__({ \
114 typeof(*private_compound_literal_array) \
115 *private_doubly_linked_list_type_array \
116 = private_compound_literal_array; \
117 struct CCC_Doubly_linked_list private_doubly_linked_list \
118 = CCC_private_doubly_linked_list_for( \
119 typeof(*private_doubly_linked_list_type_array), \
120 private_type_intruder_field \
122 CCC_Allocator const *const private_doubly_linked_list_allocator \
123 = &(private_allocator); \
124 if (private_doubly_linked_list_allocator->allocate) { \
125 size_t const private_count \
126 = sizeof(private_compound_literal_array) \
127 / sizeof(*private_doubly_linked_list_type_array); \
128 for (size_t private_i = 0; private_i < private_count; \
130 typeof(*private_doubly_linked_list_type_array) *const \
132 = private_doubly_linked_list_allocator->allocate( \
133 (CCC_Allocator_arguments){ \
135 .bytes = private_doubly_linked_list.sizeof_type, \
137 = private_doubly_linked_list_allocator->context, \
140 if (!private_new_node) { \
141 CCC_doubly_linked_list_clear( \
142 &private_doubly_linked_list, \
143 &private_destructor, \
144 private_doubly_linked_list_allocator \
149 = private_doubly_linked_list_type_array[private_i]; \
150 CCC_private_doubly_linked_list_push_back( \
151 &private_doubly_linked_list, \
152 CCC_private_doubly_linked_list_node_in( \
153 &private_doubly_linked_list, private_new_node \
158 private_doubly_linked_list; \
162#define CCC_private_doubly_linked_list_emplace_back( \
163 doubly_linked_list_pointer, \
164 private_allocator_pointer, \
165 struct_initializer... \
168 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
169 struct CCC_Doubly_linked_list *private_doubly_linked_list \
170 = (doubly_linked_list_pointer); \
171 CCC_Allocator const *const private_doubly_linked_list_allocator \
172 = (private_allocator_pointer); \
173 if (private_doubly_linked_list && private_doubly_linked_list_allocator \
174 && private_doubly_linked_list_allocator->allocate) { \
175 private_doubly_linked_list_res \
176 = private_doubly_linked_list_allocator->allocate(( \
177 CCC_Allocator_arguments \
180 .bytes = private_doubly_linked_list->sizeof_type, \
181 .context = private_doubly_linked_list_allocator->context, \
183 if (private_doubly_linked_list_res) { \
184 *private_doubly_linked_list_res = struct_initializer; \
185 CCC_private_doubly_linked_list_push_back( \
186 private_doubly_linked_list, \
187 CCC_private_doubly_linked_list_node_in( \
188 private_doubly_linked_list, \
189 private_doubly_linked_list_res \
194 private_doubly_linked_list_res; \
198#define CCC_private_doubly_linked_list_emplace_front( \
199 doubly_linked_list_pointer, \
200 private_allocator_pointer, \
201 struct_initializer... \
204 typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
205 struct CCC_Doubly_linked_list *private_doubly_linked_list \
206 = (doubly_linked_list_pointer); \
207 CCC_Allocator const *const private_doubly_linked_list_allocator \
208 = (private_allocator_pointer); \
209 if (private_doubly_linked_list && private_doubly_linked_list_allocator \
210 && private_doubly_linked_list_allocator->allocate) { \
211 private_doubly_linked_list_res \
212 = private_doubly_linked_list_allocator->allocate(( \
213 CCC_Allocator_arguments \
216 .bytes = private_doubly_linked_list->sizeof_type, \
217 .context = private_doubly_linked_list_allocator->context, \
219 if (private_doubly_linked_list_res) { \
220 *private_doubly_linked_list_res = struct_initializer; \
221 CCC_private_doubly_linked_list_push_front( \
222 private_doubly_linked_list, \
223 CCC_private_doubly_linked_list_node_in( \
224 private_doubly_linked_list, \
225 private_doubly_linked_list_res \
230 private_doubly_linked_list_res; \
Definition: private_doubly_linked_list.h:32
struct CCC_Doubly_linked_list_node * previous
Definition: private_doubly_linked_list.h:36
struct CCC_Doubly_linked_list_node * next
Definition: private_doubly_linked_list.h:34
Definition: private_doubly_linked_list.h:66
size_t sizeof_type
Definition: private_doubly_linked_list.h:72
size_t type_intruder_offset
Definition: private_doubly_linked_list.h:74
struct CCC_Doubly_linked_list_node * head
Definition: private_doubly_linked_list.h:68
struct CCC_Doubly_linked_list_node * tail
Definition: private_doubly_linked_list.h:70