16#ifndef CCC_PRIVATE_SINGLY_LINKED_LIST_H
17#define CCC_PRIVATE_SINGLY_LINKED_LIST_H
97#define CCC_private_singly_linked_list_initialize( \
98 private_struct_name, private_singly_linked_list_node_field, \
99 private_compare, private_allocate, private_context_data) \
102 .sizeof_type = sizeof(private_struct_name), \
103 .type_intruder_offset = offsetof( \
104 private_struct_name, private_singly_linked_list_node_field), \
106 .allocate = (private_allocate), \
107 .compare = (private_compare), \
108 .context = (private_context_data), \
112#define CCC_private_singly_linked_list_with_allocator( \
113 private_struct_name, private_type_intruder_field, private_compare, \
117 .sizeof_type = sizeof(private_struct_name), \
118 .type_intruder_offset \
119 = offsetof(private_struct_name, private_type_intruder_field), \
121 .allocate = (private_allocate), \
122 .compare = (private_compare), \
127#define CCC_private_singly_linked_list_with_context_allocator( \
128 private_struct_name, private_type_intruder_field, private_compare, \
129 private_allocate, private_context) \
132 .sizeof_type = sizeof(private_struct_name), \
133 .type_intruder_offset \
134 = offsetof(private_struct_name, private_type_intruder_field), \
136 .allocate = (private_allocate), \
137 .compare = (private_compare), \
138 .context = (private_context), \
142#define CCC_private_singly_linked_list_from( \
143 private_type_intruder_field, private_compare, private_allocate, \
144 private_destroy, private_context_data, private_compound_literal_array...) \
146 typeof(*private_compound_literal_array) \
147 *private_singly_linked_list_type_array \
148 = private_compound_literal_array; \
149 struct CCC_Singly_linked_list private_singly_linked_list \
150 = CCC_private_singly_linked_list_initialize( \
151 typeof(*private_singly_linked_list_type_array), \
152 private_type_intruder_field, private_compare, \
153 private_allocate, private_context_data); \
154 if (private_singly_linked_list.allocate) \
156 size_t private_count \
157 = sizeof(private_compound_literal_array) \
158 / sizeof(*private_singly_linked_list_type_array); \
159 while (private_count--) \
161 typeof(*private_singly_linked_list_type_array) *const \
163 = private_singly_linked_list.allocate( \
164 (CCC_Allocator_context){ \
166 .bytes = private_singly_linked_list.sizeof_type, \
167 .context = private_singly_linked_list.context, \
169 if (!private_new_node) \
171 CCC_singly_linked_list_clear(&private_singly_linked_list, \
176 = private_singly_linked_list_type_array[private_count]; \
177 CCC_private_singly_linked_list_push_front( \
178 &private_singly_linked_list, \
179 CCC_private_singly_linked_list_node_in( \
180 &private_singly_linked_list, private_new_node)); \
183 private_singly_linked_list; \
187#define CCC_private_singly_linked_list_emplace_front(list_pointer, \
188 struct_initializer...) \
190 typeof(struct_initializer) *private_singly_linked_list_res = NULL; \
191 struct CCC_Singly_linked_list *private_singly_linked_list \
193 if (private_singly_linked_list) \
195 if (!private_singly_linked_list->allocate) \
197 private_singly_linked_list_res = NULL; \
201 private_singly_linked_list_res \
202 = private_singly_linked_list->allocate( \
203 (CCC_Allocator_context){ \
205 .bytes = private_singly_linked_list->sizeof_type, \
206 .context = private_singly_linked_list->context, \
208 if (private_singly_linked_list_res) \
210 *private_singly_linked_list_res = struct_initializer; \
211 CCC_private_singly_linked_list_push_front( \
212 private_singly_linked_list, \
213 CCC_private_singly_linked_list_node_in( \
214 private_singly_linked_list, \
215 private_singly_linked_list_res)); \
219 private_singly_linked_list_res; \
Definition: private_singly_linked_list.h:33
struct CCC_Singly_linked_list_node * next
Definition: private_singly_linked_list.h:35
Definition: private_singly_linked_list.h:66
size_t type_intruder_offset
Definition: private_singly_linked_list.h:74
CCC_Allocator * allocate
Definition: private_singly_linked_list.h:78
void * context
Definition: private_singly_linked_list.h:80
struct CCC_Singly_linked_list_node * head
Definition: private_singly_linked_list.h:68
size_t count
Definition: private_singly_linked_list.h:70
CCC_Type_comparator * compare
Definition: private_singly_linked_list.h:76
size_t sizeof_type
Definition: private_singly_linked_list.h:72
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