16#ifndef CCC_PRIVATE_SINGLY_LINKED_LIST_H
17#define CCC_PRIVATE_SINGLY_LINKED_LIST_H
75void CCC_private_singly_linked_list_push_front(
86#define CCC_private_singly_linked_list_for( \
87 private_struct_name, private_singly_linked_list_node_field \
89 (struct CCC_Singly_linked_list) { \
90 .head = NULL, .sizeof_type = sizeof(private_struct_name), \
91 .type_intruder_offset = offsetof( \
92 private_struct_name, private_singly_linked_list_node_field \
97#define CCC_private_singly_linked_list_default( \
98 private_struct_name, private_singly_linked_list_node_field \
100 CCC_private_singly_linked_list_for( \
101 private_struct_name, private_singly_linked_list_node_field \
105#define CCC_private_singly_linked_list_from( \
106 private_type_intruder_field, \
108 private_destructor, \
109 private_compound_literal_array... \
111 (struct { struct CCC_Singly_linked_list private; }){(__extension__({ \
112 typeof(*private_compound_literal_array) \
113 *private_singly_linked_list_type_array \
114 = private_compound_literal_array; \
115 struct CCC_Singly_linked_list private_singly_linked_list \
116 = CCC_private_singly_linked_list_for( \
117 typeof(*private_singly_linked_list_type_array), \
118 private_type_intruder_field \
120 CCC_Allocator const *const private_singly_linked_list_allocator \
121 = &(private_allocator); \
122 if (private_singly_linked_list_allocator->allocate) { \
123 size_t private_count \
124 = sizeof(private_compound_literal_array) \
125 / sizeof(*private_singly_linked_list_type_array); \
126 while (private_count--) { \
127 typeof(*private_singly_linked_list_type_array) *const \
129 = private_singly_linked_list_allocator->allocate( \
130 (CCC_Allocator_arguments){ \
132 .bytes = private_singly_linked_list.sizeof_type, \
134 = private_singly_linked_list_allocator->context, \
137 if (!private_new_node) { \
138 CCC_singly_linked_list_clear( \
139 &private_singly_linked_list, \
140 &private_destructor, \
141 private_singly_linked_list_allocator \
146 = private_singly_linked_list_type_array[private_count]; \
147 CCC_private_singly_linked_list_push_front( \
148 &private_singly_linked_list, \
149 CCC_private_singly_linked_list_node_in( \
150 &private_singly_linked_list, private_new_node \
155 private_singly_linked_list; \
159#define CCC_private_singly_linked_list_emplace_front( \
160 list_pointer, private_allocator_pointer, struct_initializer... \
163 typeof(struct_initializer) *private_singly_linked_list_res = NULL; \
164 struct CCC_Singly_linked_list *private_singly_linked_list \
166 CCC_Allocator const *const private_singly_linked_list_allocator \
167 = (private_allocator_pointer); \
168 if (private_singly_linked_list && private_singly_linked_list_allocator \
169 && private_singly_linked_list_allocator->allocate) { \
170 private_singly_linked_list_res \
171 = private_singly_linked_list->allocate( \
172 (CCC_Allocator_arguments){ \
174 .bytes = private_singly_linked_list->sizeof_type, \
175 .context = private_singly_linked_list->context, \
178 if (private_singly_linked_list_res) { \
179 *private_singly_linked_list_res = struct_initializer; \
180 CCC_private_singly_linked_list_push_front( \
181 private_singly_linked_list, \
182 CCC_private_singly_linked_list_node_in( \
183 private_singly_linked_list, \
184 private_singly_linked_list_res \
189 private_singly_linked_list_res; \
Definition: private_singly_linked_list.h:31
struct CCC_Singly_linked_list_node * next
Definition: private_singly_linked_list.h:33
Definition: private_singly_linked_list.h:63
size_t type_intruder_offset
Definition: private_singly_linked_list.h:69
struct CCC_Singly_linked_list_node * head
Definition: private_singly_linked_list.h:65
size_t sizeof_type
Definition: private_singly_linked_list.h:67