C Container Collection (CCC)
Loading...
Searching...
No Matches
private_doubly_linked_list.h
1
16#ifndef CCC_PRIVATE_DOUBLY_LINKED_LIST_H
17#define CCC_PRIVATE_DOUBLY_LINKED_LIST_H
18
20#include <stddef.h>
23#include "../types.h" /* IWYU pragma: keep */
24
25/* NOLINTBEGIN(readability-identifier-naming) */
26
37};
38
75};
76
77/*======================= Private Interface ===========================*/
78
80void CCC_private_doubly_linked_list_push_back(
82);
84void CCC_private_doubly_linked_list_push_front(
86);
88struct CCC_Doubly_linked_list_node *CCC_private_doubly_linked_list_node_in(
89 struct CCC_Doubly_linked_list const *, void const *any_struct
90);
91
92/*======================= Macro Implementations =======================*/
93
96#define CCC_private_doubly_linked_list_for( \
97 private_struct_name, private_type_intruder_field \
98) \
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), \
104 }
105
107#define CCC_private_doubly_linked_list_from( \
108 private_type_intruder_field, \
109 private_allocator, \
110 private_destructor, \
111 private_compound_literal_array... \
112) \
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 \
121 ); \
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; \
129 ++private_i) { \
130 typeof(*private_doubly_linked_list_type_array) *const \
131 private_new_node \
132 = private_doubly_linked_list_allocator->allocate( \
133 (CCC_Allocator_arguments){ \
134 .input = NULL, \
135 .bytes = private_doubly_linked_list.sizeof_type, \
136 .context \
137 = private_doubly_linked_list_allocator->context, \
138 } \
139 ); \
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 \
145 ); \
146 break; \
147 } \
148 *private_new_node \
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 \
154 ) \
155 ); \
156 } \
157 } \
158 private_doubly_linked_list; \
159 }))}.private
160
162#define CCC_private_doubly_linked_list_emplace_back( \
163 doubly_linked_list_pointer, \
164 private_allocator_pointer, \
165 struct_initializer... \
166) \
167 (__extension__({ \
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 \
178 ){ \
179 .input = NULL, \
180 .bytes = private_doubly_linked_list->sizeof_type, \
181 .context = private_doubly_linked_list_allocator->context, \
182 }); \
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 \
190 ) \
191 ); \
192 } \
193 } \
194 private_doubly_linked_list_res; \
195 }))
196
198#define CCC_private_doubly_linked_list_emplace_front( \
199 doubly_linked_list_pointer, \
200 private_allocator_pointer, \
201 struct_initializer... \
202) \
203 (__extension__({ \
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 \
214 ){ \
215 .input = NULL, \
216 .bytes = private_doubly_linked_list->sizeof_type, \
217 .context = private_doubly_linked_list_allocator->context, \
218 }); \
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 \
226 ) \
227 ); \
228 } \
229 } \
230 private_doubly_linked_list_res; \
231 }))
232
233/* NOLINTEND(readability-identifier-naming) */
234
235#endif /* CCC_PRIVATE_DOUBLY_LINKED_LIST_H */
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