25#ifndef CCC_PRIVATE_SINGLY_LINKED_LIST_H
26#define CCC_PRIVATE_SINGLY_LINKED_LIST_H
97#define CCC_private_singly_linked_list_for( \
98 private_struct_name, private_singly_linked_list_node_field \
100 (struct CCC_Singly_linked_list) { \
101 .head = NULL, .sizeof_type = sizeof(private_struct_name), \
102 .alignof_type = alignof(private_struct_name), \
103 .type_intruder_offset = offsetof( \
104 private_struct_name, private_singly_linked_list_node_field \
109#define CCC_private_singly_linked_list_default( \
110 private_struct_name, private_singly_linked_list_node_field \
112 CCC_private_singly_linked_list_for( \
113 private_struct_name, private_singly_linked_list_node_field \
117#define CCC_private_singly_linked_list_from( \
118 private_type_intruder_field, \
120 private_destructor, \
121 private_compound_literal_array... \
123 (struct { struct CCC_Singly_linked_list private; }){(__extension__({ \
124 typeof(*private_compound_literal_array) \
125 *private_singly_linked_list_type_array \
126 = private_compound_literal_array; \
127 struct CCC_Singly_linked_list private_singly_linked_list \
128 = CCC_private_singly_linked_list_for( \
129 typeof(*private_singly_linked_list_type_array), \
130 private_type_intruder_field \
132 CCC_Allocator const *const private_singly_linked_list_allocator \
133 = &(private_allocator); \
134 if (private_singly_linked_list_allocator->allocate) { \
135 size_t private_count \
136 = sizeof(private_compound_literal_array) \
137 / sizeof(*private_singly_linked_list_type_array); \
138 while (private_count--) { \
139 typeof(*private_singly_linked_list_type_array) *const \
141 = private_singly_linked_list_allocator->allocate( \
142 (CCC_Allocator_arguments){ \
144 .bytes = private_singly_linked_list.sizeof_type, \
146 = private_singly_linked_list_allocator->context, \
149 if (!private_new_node) { \
150 CCC_singly_linked_list_clear( \
151 &private_singly_linked_list, \
152 &private_destructor, \
153 private_singly_linked_list_allocator \
158 = private_singly_linked_list_type_array[private_count]; \
159 CCC_private_singly_linked_list_push_front( \
160 &private_singly_linked_list, \
161 CCC_private_singly_linked_list_node_in( \
162 &private_singly_linked_list, private_new_node \
167 private_singly_linked_list; \
171#define CCC_private_singly_linked_list_emplace_front( \
172 list_pointer, private_allocator_pointer, struct_initializer... \
175 typeof(struct_initializer) *private_singly_linked_list_res = NULL; \
176 struct CCC_Singly_linked_list *private_singly_linked_list \
178 CCC_Allocator const *const private_singly_linked_list_allocator \
179 = (private_allocator_pointer); \
180 if (private_singly_linked_list && private_singly_linked_list_allocator \
181 && private_singly_linked_list_allocator->allocate) { \
182 private_singly_linked_list_res \
183 = private_singly_linked_list->allocate( \
184 (CCC_Allocator_arguments){ \
186 .bytes = private_singly_linked_list->sizeof_type, \
187 .context = private_singly_linked_list->context, \
190 if (private_singly_linked_list_res) { \
191 *private_singly_linked_list_res = struct_initializer; \
192 CCC_private_singly_linked_list_push_front( \
193 private_singly_linked_list, \
194 CCC_private_singly_linked_list_node_in( \
195 private_singly_linked_list, \
196 private_singly_linked_list_res \
201 private_singly_linked_list_res; \
struct CCC_Singly_linked_list_node * CCC_private_singly_linked_list_node_in(struct CCC_Singly_linked_list const *, void const *)
void CCC_private_singly_linked_list_push_front(struct CCC_Singly_linked_list *, struct CCC_Singly_linked_list_node *)
Definition: private_singly_linked_list.h:40
struct CCC_Singly_linked_list_node * next
Definition: private_singly_linked_list.h:42
Definition: private_singly_linked_list.h:72
size_t type_intruder_offset
Definition: private_singly_linked_list.h:80
struct CCC_Singly_linked_list_node * head
Definition: private_singly_linked_list.h:74
size_t alignof_type
Definition: private_singly_linked_list.h:78
size_t sizeof_type
Definition: private_singly_linked_list.h:76