C Container Collection (CCC)
Loading...
Searching...
No Matches
private_singly_linked_list.h
1
16#ifndef CCC_PRIVATE_SINGLY_LINKED_LIST_H
17#define CCC_PRIVATE_SINGLY_LINKED_LIST_H
18
20#include <stddef.h>
23#include "../types.h" /* IWYU pragma: keep */
24
25/* NOLINTBEGIN(readability-identifier-naming) */
26
34};
35
70};
71
72/*========================= Private Interface ============================*/
73
75void CCC_private_singly_linked_list_push_front(
77);
79struct CCC_Singly_linked_list_node *CCC_private_singly_linked_list_node_in(
80 struct CCC_Singly_linked_list const *, void const *
81);
82
83/*====================== Macro Implementations ========================*/
84
86#define CCC_private_singly_linked_list_for( \
87 private_struct_name, private_singly_linked_list_node_field \
88) \
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 \
93 ), \
94 }
95
97#define CCC_private_singly_linked_list_default( \
98 private_struct_name, private_singly_linked_list_node_field \
99) \
100 CCC_private_singly_linked_list_for( \
101 private_struct_name, private_singly_linked_list_node_field \
102 )
103
105#define CCC_private_singly_linked_list_from( \
106 private_type_intruder_field, \
107 private_allocator, \
108 private_destructor, \
109 private_compound_literal_array... \
110) \
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 \
119 ); \
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 \
128 private_new_node \
129 = private_singly_linked_list_allocator->allocate( \
130 (CCC_Allocator_arguments){ \
131 .input = NULL, \
132 .bytes = private_singly_linked_list.sizeof_type, \
133 .context \
134 = private_singly_linked_list_allocator->context, \
135 } \
136 ); \
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 \
142 ); \
143 break; \
144 } \
145 *private_new_node \
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 \
151 ) \
152 ); \
153 } \
154 } \
155 private_singly_linked_list; \
156 }))}.private
157
159#define CCC_private_singly_linked_list_emplace_front( \
160 list_pointer, private_allocator_pointer, struct_initializer... \
161) \
162 (__extension__({ \
163 typeof(struct_initializer) *private_singly_linked_list_res = NULL; \
164 struct CCC_Singly_linked_list *private_singly_linked_list \
165 = (list_pointer); \
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){ \
173 .input = NULL, \
174 .bytes = private_singly_linked_list->sizeof_type, \
175 .context = private_singly_linked_list->context, \
176 } \
177 ); \
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 \
185 ) \
186 ); \
187 } \
188 } \
189 private_singly_linked_list_res; \
190 }))
191
192/* NOLINTEND(readability-identifier-naming) */
193
194#endif /* CCC_PRIVATE_SINGLY_LINKED_LIST_H */
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