16#ifndef CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
23#include "../flat_buffer.h"
48size_t CCC_private_flat_priority_queue_bubble_up(
52void CCC_private_flat_priority_queue_heap_order(
56void *CCC_private_flat_priority_queue_update_fixup(
63#define CCC_private_flat_priority_queue_default( \
64 private_type_name, private_order, private_comparator... \
66 (struct CCC_Flat_priority_queue) { \
67 .buffer = CCC_flat_buffer_default(private_type_name), \
68 .order = (private_order), .comparator = private_comparator, \
72#define CCC_private_flat_priority_queue_for( \
77 private_data_pointer \
79 (struct CCC_Flat_priority_queue) { \
80 .buffer = CCC_flat_buffer_for( \
81 private_type_name, private_capacity, 0, private_data_pointer \
83 .order = (private_order), .comparator = (private_comparator), \
87#define CCC_private_flat_priority_queue_heapify( \
93 private_data_pointer... \
95 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
97 private_data_pointer \
98 )) *private_flat_priority_queue_heapify_data = private_data_pointer; \
99 struct CCC_Flat_priority_queue private_flat_priority_queue_heapify_res \
100 = CCC_private_flat_priority_queue_for( \
103 private_comparator, \
105 private_flat_priority_queue_heapify_data \
107 private_flat_priority_queue_heapify_res.buffer.count = (private_size); \
108 CCC_private_flat_priority_queue_heap_order( \
109 &private_flat_priority_queue_heapify_res, &(private_type_name){} \
111 private_flat_priority_queue_heapify_res; \
115#define CCC_private_flat_priority_queue_from( \
117 private_comparator, \
119 private_optional_capacity, \
120 private_compound_literal_array... \
122 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
123 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
124 .buffer = CCC_flat_buffer_from( \
126 private_optional_capacity, \
127 private_compound_literal_array \
129 .order = (private_order), \
130 .comparator = (private_comparator), \
132 if (private_flat_priority_queue.buffer.count) { \
133 CCC_private_flat_priority_queue_heap_order( \
134 &private_flat_priority_queue, \
135 &(typeof(*private_compound_literal_array)){} \
138 private_flat_priority_queue; \
142#define CCC_private_flat_priority_queue_with_capacity( \
145 private_comparator, \
149 (struct { struct CCC_Flat_priority_queue private; }){(__extension__({ \
150 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
151 .buffer = CCC_flat_buffer_with_capacity( \
152 private_type_name, private_allocator, private_capacity \
154 .order = (private_order), \
155 .comparator = (private_comparator), \
157 private_flat_priority_queue; \
164#if defined(__clang__) || defined(__llvm__)
165# define CCC_private_flat_priority_queue_with_storage( \
166 private_order, private_comparator, private_compound_literal \
170 (private_order) == CCC_ORDER_LESSER \
171 || (private_order) == CCC_ORDER_GREATER, \
172 "flat priority queue must be a min or max priority queue" \
174 struct CCC_Flat_priority_queue private; \
177 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
178 .order = (private_order), \
179 .comparator = (private_comparator), \
184# define CCC_private_flat_priority_queue_with_storage( \
185 private_order, private_comparator, private_compound_literal \
187 (struct CCC_Flat_priority_queue) { \
189 = CCC_flat_buffer_with_storage(0, private_compound_literal), \
190 .order = (private_order), .comparator = (private_comparator), \
197#define CCC_private_flat_priority_queue_emplace( \
198 flat_priority_queue, private_allocator_pointer, type_compound_literal... \
201 struct CCC_Flat_priority_queue *private_flat_priority_queue \
202 = (flat_priority_queue); \
203 typeof(type_compound_literal) *private_flat_priority_queue_res \
204 = CCC_flat_buffer_allocate_back( \
205 &private_flat_priority_queue->buffer, \
206 private_allocator_pointer \
208 if (private_flat_priority_queue_res) { \
209 *private_flat_priority_queue_res = type_compound_literal; \
210 if (private_flat_priority_queue->buffer.count > 1) { \
211 private_flat_priority_queue_res = CCC_flat_buffer_at( \
212 &private_flat_priority_queue->buffer, \
213 CCC_private_flat_priority_queue_bubble_up( \
214 private_flat_priority_queue, \
215 &(typeof(type_compound_literal)){}, \
216 private_flat_priority_queue->buffer.count - 1 \
220 private_flat_priority_queue_res = CCC_flat_buffer_at( \
221 &private_flat_priority_queue->buffer, 0 \
225 private_flat_priority_queue_res; \
230#define CCC_private_flat_priority_queue_update_with( \
231 flat_priority_queue_pointer, \
233 update_closure_over_closure_parameter... \
236 struct CCC_Flat_priority_queue const *const \
237 private_flat_priority_queue = (flat_priority_queue_pointer); \
238 typeof(*closure_parameter) * \
239 private_flat_priority_queue_updated_element = (closure_parameter); \
240 if (private_flat_priority_queue \
241 && !CCC_flat_buffer_is_empty( \
242 &private_flat_priority_queue->buffer \
244 {update_closure_over_closure_parameter}; \
245 private_flat_priority_queue_updated_element \
246 = CCC_private_flat_priority_queue_update_fixup( \
247 private_flat_priority_queue, \
248 private_flat_priority_queue_updated_element, \
249 &(typeof(*closure_parameter)){} \
252 private_flat_priority_queue_updated_element; \
256#define CCC_private_flat_priority_queue_increase_with( \
257 flat_priority_queue_pointer, \
259 increase_closure_over_closure_parameter... \
261 CCC_private_flat_priority_queue_update_with( \
262 flat_priority_queue_pointer, \
264 increase_closure_over_closure_parameter \
268#define CCC_private_flat_priority_queue_decrease_with( \
269 flat_priority_queue_pointer, \
271 decrease_closure_over_closure_parameter... \
273 CCC_private_flat_priority_queue_update_with( \
274 flat_priority_queue_pointer, \
276 decrease_closure_over_closure_parameter \
The type passed by reference to any container function that may need to compare elements....
Definition: types.h:409
Definition: private_flat_buffer.h:32
Definition: private_flat_priority_queue.h:34
CCC_Comparator comparator
Definition: private_flat_priority_queue.h:42
CCC_Flat_buffer buffer
Definition: private_flat_priority_queue.h:37
CCC_Order order
Definition: private_flat_priority_queue.h:40
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:213