27#ifndef CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
28#define CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
34#include "../flat_buffer.h"
74#define CCC_private_flat_priority_queue_default( \
75 private_type_name, private_order, private_comparator... \
77 (struct CCC_Flat_priority_queue) { \
78 .buffer = CCC_flat_buffer_default(private_type_name), \
79 .order = (private_order), .comparator = private_comparator, \
83#define CCC_private_flat_priority_queue_for( \
88 private_data_pointer \
90 (struct CCC_Flat_priority_queue) { \
91 .buffer = CCC_flat_buffer_for( \
92 private_type_name, private_capacity, 0, private_data_pointer \
94 .order = (private_order), .comparator = (private_comparator), \
98#define CCC_private_flat_priority_queue_heapify( \
101 private_comparator, \
104 private_data_pointer... \
106 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
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( \
114 private_comparator, \
116 private_flat_priority_queue_heapify_data \
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){} \
122 private_flat_priority_queue_heapify_res; \
126#define CCC_private_flat_priority_queue_from( \
128 private_comparator, \
130 private_optional_capacity, \
131 private_compound_literal_array... \
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( \
137 private_optional_capacity, \
138 private_compound_literal_array \
140 .order = (private_order), \
141 .comparator = (private_comparator), \
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)){} \
149 private_flat_priority_queue; \
153#define CCC_private_flat_priority_queue_with_capacity( \
156 private_comparator, \
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 \
165 .order = (private_order), \
166 .comparator = (private_comparator), \
168 private_flat_priority_queue; \
175#if defined(__clang__) || defined(__llvm__)
176# define CCC_private_flat_priority_queue_with_storage( \
177 private_order, private_comparator, private_compound_literal \
181 (private_order) == CCC_ORDER_LESSER \
182 || (private_order) == CCC_ORDER_GREATER, \
183 "flat priority queue must be a min or max priority queue" \
185 struct CCC_Flat_priority_queue private; \
188 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
189 .order = (private_order), \
190 .comparator = (private_comparator), \
195# define CCC_private_flat_priority_queue_with_storage( \
196 private_order, private_comparator, private_compound_literal \
198 (struct CCC_Flat_priority_queue) { \
200 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
201 .order = (private_order), .comparator = (private_comparator), \
208#define CCC_private_flat_priority_queue_emplace( \
209 flat_priority_queue, private_allocator_pointer, type_compound_literal... \
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 \
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 \
231 private_flat_priority_queue_res = CCC_flat_buffer_at( \
232 &private_flat_priority_queue->buffer, 0 \
236 private_flat_priority_queue_res; \
241#define CCC_private_flat_priority_queue_update_with( \
242 flat_priority_queue_pointer, \
244 update_closure_over_closure_parameter... \
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 \
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)){} \
263 private_flat_priority_queue_updated_element; \
267#define CCC_private_flat_priority_queue_increase_with( \
268 flat_priority_queue_pointer, \
270 increase_closure_over_closure_parameter... \
272 CCC_private_flat_priority_queue_update_with( \
273 flat_priority_queue_pointer, \
275 increase_closure_over_closure_parameter \
279#define CCC_private_flat_priority_queue_decrease_with( \
280 flat_priority_queue_pointer, \
282 decrease_closure_over_closure_parameter... \
284 CCC_private_flat_priority_queue_update_with( \
285 flat_priority_queue_pointer, \
287 decrease_closure_over_closure_parameter \
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