C Container Collection (CCC)
Loading...
Searching...
No Matches
private_flat_priority_queue.h
Go to the documentation of this file.
1
27#ifndef CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
28#define CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
29
31#include <stddef.h>
34#include "../flat_buffer.h"
35#include "../types.h" /* IWYU pragma: keep */
36
37/* NOLINTBEGIN(readability-identifier-naming) */
38
54};
55
56/*======================== Private Interface =========================*/
57
60 struct CCC_Flat_priority_queue const *, void *, size_t
61);
64 struct CCC_Flat_priority_queue const *, void *
65);
68 struct CCC_Flat_priority_queue const *, void *, void *
69);
70
71/*====================== Macro Implementations ========================*/
72
74#define CCC_private_flat_priority_queue_default( \
75 private_type_name, private_order, private_comparator... \
76) \
77 (struct CCC_Flat_priority_queue) { \
78 .buffer = CCC_flat_buffer_default(private_type_name), \
79 .order = (private_order), .comparator = private_comparator, \
80 }
81
83#define CCC_private_flat_priority_queue_for( \
84 private_type_name, \
85 private_order, \
86 private_comparator, \
87 private_capacity, \
88 private_data_pointer \
89) \
90 (struct CCC_Flat_priority_queue) { \
91 .buffer = CCC_flat_buffer_for( \
92 private_type_name, private_capacity, 0, private_data_pointer \
93 ), \
94 .order = (private_order), .comparator = (private_comparator), \
95 }
96
98#define CCC_private_flat_priority_queue_heapify( \
99 private_type_name, \
100 private_order, \
101 private_comparator, \
102 private_capacity, \
103 private_size, \
104 private_data_pointer... \
105) \
106 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
107 typeof(*( \
108 private_data_pointer \
109 )) *private_flat_priority_queue_heapify_data = private_data_pointer; \
110 struct CCC_Flat_priority_queue private_flat_priority_queue_heapify_res \
111 = CCC_private_flat_priority_queue_for( \
112 private_type_name, \
113 private_order, \
114 private_comparator, \
115 private_capacity, \
116 private_flat_priority_queue_heapify_data \
117 ); \
118 private_flat_priority_queue_heapify_res.buffer.count = (private_size); \
119 CCC_private_flat_priority_queue_heap_order( \
120 &private_flat_priority_queue_heapify_res, &(private_type_name){} \
121 ); \
122 private_flat_priority_queue_heapify_res; \
123 }))}.private
124
126#define CCC_private_flat_priority_queue_from( \
127 private_order, \
128 private_comparator, \
129 private_allocator, \
130 private_optional_capacity, \
131 private_compound_literal_array... \
132) \
133 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
134 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
135 .buffer = CCC_flat_buffer_from( \
136 private_allocator, \
137 private_optional_capacity, \
138 private_compound_literal_array \
139 ), \
140 .order = (private_order), \
141 .comparator = (private_comparator), \
142 }; \
143 if (private_flat_priority_queue.buffer.count) { \
144 CCC_private_flat_priority_queue_heap_order( \
145 &private_flat_priority_queue, \
146 &(typeof(*private_compound_literal_array)){} \
147 ); \
148 } \
149 private_flat_priority_queue; \
150 }))}.private
151
153#define CCC_private_flat_priority_queue_with_capacity( \
154 private_type_name, \
155 private_order, \
156 private_comparator, \
157 private_allocator, \
158 private_capacity \
159) \
160 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
161 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
162 .buffer = CCC_flat_buffer_with_capacity( \
163 private_type_name, private_allocator, private_capacity \
164 ), \
165 .order = (private_order), \
166 .comparator = (private_comparator), \
167 }; \
168 private_flat_priority_queue; \
169 }))}.private
170
175#if defined(__clang__) || defined(__llvm__)
176# define CCC_private_flat_priority_queue_with_storage( \
177 private_order, private_comparator, private_compound_literal \
178 ) \
179 (struct { \
180 static_assert( \
181 (private_order) == CCC_ORDER_LESSER \
182 || (private_order) == CCC_ORDER_GREATER, \
183 "flat priority queue must be a min or max priority queue" \
184 ); \
185 struct CCC_Flat_priority_queue private; \
186 }){{ \
187 .buffer \
188 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
189 .order = (private_order), \
190 .comparator = (private_comparator), \
191 }} \
192 .private
193#else
195# define CCC_private_flat_priority_queue_with_storage( \
196 private_order, private_comparator, private_compound_literal \
197 ) \
198 (struct CCC_Flat_priority_queue) { \
199 .buffer \
200 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
201 .order = (private_order), .comparator = (private_comparator), \
202 }
203#endif
204
208#define CCC_private_flat_priority_queue_emplace( \
209 flat_priority_queue, private_allocator_pointer, type_compound_literal... \
210) \
211 (__extension__({ \
212 struct CCC_Flat_priority_queue *private_flat_priority_queue \
213 = (flat_priority_queue); \
214 typeof(type_compound_literal) *private_flat_priority_queue_res \
215 = CCC_flat_buffer_allocate_back( \
216 &private_flat_priority_queue->buffer, \
217 private_allocator_pointer \
218 ); \
219 if (private_flat_priority_queue_res) { \
220 *private_flat_priority_queue_res = type_compound_literal; \
221 if (private_flat_priority_queue->buffer.count > 1) { \
222 private_flat_priority_queue_res = CCC_flat_buffer_at( \
223 &private_flat_priority_queue->buffer, \
224 CCC_private_flat_priority_queue_bubble_up( \
225 private_flat_priority_queue, \
226 &(typeof(type_compound_literal)){}, \
227 private_flat_priority_queue->buffer.count - 1 \
228 ) \
229 ); \
230 } else { \
231 private_flat_priority_queue_res = CCC_flat_buffer_at( \
232 &private_flat_priority_queue->buffer, 0 \
233 ); \
234 } \
235 } \
236 private_flat_priority_queue_res; \
237 }))
238
241#define CCC_private_flat_priority_queue_update_with( \
242 flat_priority_queue_pointer, \
243 closure_parameter, \
244 update_closure_over_closure_parameter... \
245) \
246 (__extension__({ \
247 struct CCC_Flat_priority_queue const *const \
248 private_flat_priority_queue = (flat_priority_queue_pointer); \
249 typeof(*closure_parameter) * \
250 private_flat_priority_queue_updated_element = (closure_parameter); \
251 if (private_flat_priority_queue \
252 && !CCC_flat_buffer_is_empty( \
253 &private_flat_priority_queue->buffer \
254 )) { \
255 {update_closure_over_closure_parameter}; \
256 private_flat_priority_queue_updated_element \
257 = CCC_private_flat_priority_queue_update_fixup( \
258 private_flat_priority_queue, \
259 private_flat_priority_queue_updated_element, \
260 &(typeof(*closure_parameter)){} \
261 ); \
262 } \
263 private_flat_priority_queue_updated_element; \
264 }))
265
267#define CCC_private_flat_priority_queue_increase_with( \
268 flat_priority_queue_pointer, \
269 closure_parameter, \
270 increase_closure_over_closure_parameter... \
271) \
272 CCC_private_flat_priority_queue_update_with( \
273 flat_priority_queue_pointer, \
274 closure_parameter, \
275 increase_closure_over_closure_parameter \
276 )
277
279#define CCC_private_flat_priority_queue_decrease_with( \
280 flat_priority_queue_pointer, \
281 closure_parameter, \
282 decrease_closure_over_closure_parameter... \
283) \
284 CCC_private_flat_priority_queue_update_with( \
285 flat_priority_queue_pointer, \
286 closure_parameter, \
287 decrease_closure_over_closure_parameter \
288 )
289
290/* NOLINTEND(readability-identifier-naming) */
291
292#endif /* CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H */
void * CCC_private_flat_priority_queue_update_fixup(struct CCC_Flat_priority_queue const *, void *, void *)
size_t CCC_private_flat_priority_queue_bubble_up(struct CCC_Flat_priority_queue const *, void *, size_t)
void CCC_private_flat_priority_queue_heap_order(struct CCC_Flat_priority_queue const *, void *)
The type passed by reference to any container function that may need to compare elements....
Definition: types.h:424
Definition: private_flat_buffer.h:40
Definition: private_flat_priority_queue.h:45
CCC_Comparator comparator
Definition: private_flat_priority_queue.h:53
CCC_Flat_buffer buffer
Definition: private_flat_priority_queue.h:48
CCC_Order order
Definition: private_flat_priority_queue.h:51
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:213