16#ifndef CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
53void CCC_private_flat_priority_queue_in_place_heapify(
63#define CCC_private_flat_priority_queue_initialize( \
64 private_type_name, private_order, private_compare, private_allocate, \
65 private_context_data, private_capacity, private_data_pointer) \
67 .buffer = CCC_buffer_initialize( \
68 private_type_name, private_allocate, private_context_data, \
69 private_capacity, 0, private_data_pointer), \
70 .order = (private_order), \
71 .compare = (private_compare), \
75#define CCC_private_flat_priority_queue_heapify_initialize( \
76 private_type_name, private_order, private_compare, private_allocate, \
77 private_context_data, private_capacity, private_size, \
78 private_data_pointer) \
81 private_data_pointer)) *private_flat_priority_queue_heapify_data \
82 = (private_data_pointer); \
83 struct CCC_Flat_priority_queue private_flat_priority_queue_heapify_res \
84 = CCC_private_flat_priority_queue_initialize( \
85 private_type_name, private_order, private_compare, \
86 private_allocate, private_context_data, private_capacity, \
87 private_flat_priority_queue_heapify_data); \
88 CCC_private_flat_priority_queue_in_place_heapify( \
89 &private_flat_priority_queue_heapify_res, (private_size), \
90 &(private_type_name){0}); \
91 private_flat_priority_queue_heapify_res; \
95#define CCC_private_flat_priority_queue_from( \
96 private_order, private_compare, private_allocate, private_context_data, \
97 private_optional_capacity, private_compound_literal_array...) \
99 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
100 .buffer = CCC_buffer_from(private_allocate, private_context_data, \
101 private_optional_capacity, \
102 private_compound_literal_array), \
103 .order = private_order, \
104 .compare = private_compare, \
106 if (private_flat_priority_queue.buffer.count) \
108 CCC_private_flat_priority_queue_in_place_heapify( \
109 &private_flat_priority_queue, \
110 private_flat_priority_queue.buffer.count, \
111 &(typeof(*private_compound_literal_array)){0}); \
113 private_flat_priority_queue; \
117#define CCC_private_flat_priority_queue_with_capacity( \
118 private_type_name, private_order, private_compare, private_allocate, \
119 private_context_data, private_capacity) \
121 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
122 .buffer = CCC_buffer_with_capacity( \
123 private_type_name, private_allocate, private_context_data, \
125 .order = (private_order), \
126 .compare = (private_compare), \
128 private_flat_priority_queue; \
132#define CCC_private_flat_priority_queue_with_compound_literal( \
133 private_order, private_compare, private_compound_literal) \
136 = CCC_buffer_with_compound_literal(0, private_compound_literal), \
137 .order = (private_order), \
138 .compare = (private_compare), \
142#define CCC_private_flat_priority_queue_with_context_compound_literal( \
143 private_order, private_compare, private_context, private_compound_literal) \
145 .buffer = CCC_buffer_with_context_compound_literal( \
146 private_context, 0, private_compound_literal), \
147 .order = (private_order), \
148 .compare = (private_compare), \
152#define CCC_private_flat_priority_queue_with_allocator( \
153 private_type_name, private_order, private_compare, private_allocate) \
156 = CCC_buffer_with_allocator(private_type_name, private_allocate), \
157 .order = (private_order), \
158 .compare = (private_compare), \
162#define CCC_private_flat_priority_queue_with_context_allocator( \
163 private_type_name, private_order, private_compare, private_allocate, \
166 .buffer = CCC_buffer_with_context_allocator( \
167 private_type_name, private_allocate, private_context), \
168 .order = (private_order), \
169 .compare = (private_compare), \
175#define CCC_private_flat_priority_queue_emplace(flat_priority_queue, \
176 type_compound_literal...) \
178 struct CCC_Flat_priority_queue *private_flat_priority_queue \
179 = (flat_priority_queue); \
180 typeof(type_compound_literal) *private_flat_priority_queue_res \
181 = CCC_buffer_allocate_back(&private_flat_priority_queue->buffer); \
182 if (private_flat_priority_queue_res) \
184 *private_flat_priority_queue_res = type_compound_literal; \
185 if (private_flat_priority_queue->buffer.count > 1) \
187 private_flat_priority_queue_res = CCC_buffer_at( \
188 &private_flat_priority_queue->buffer, \
189 CCC_private_flat_priority_queue_bubble_up( \
190 private_flat_priority_queue, \
191 &(typeof(type_compound_literal)){0}, \
192 private_flat_priority_queue->buffer.count - 1)); \
196 private_flat_priority_queue_res \
197 = CCC_buffer_at(&private_flat_priority_queue->buffer, 0); \
200 private_flat_priority_queue_res; \
205#define CCC_private_flat_priority_queue_update_with( \
206 flat_priority_queue_pointer, T_pointer, update_closure_over_T...) \
208 struct CCC_Flat_priority_queue *const private_flat_priority_queue \
209 = (flat_priority_queue_pointer); \
210 typeof(*T_pointer) *T = (T_pointer); \
211 if (private_flat_priority_queue \
212 && !CCC_buffer_is_empty(&private_flat_priority_queue->buffer) \
215 {update_closure_over_T} T \
216 = CCC_private_flat_priority_queue_update_fixup( \
217 private_flat_priority_queue, T, &(typeof(*T_pointer)){0}); \
223#define CCC_private_flat_priority_queue_increase_with( \
224 flat_priority_queue_pointer, T_pointer, increase_closure_over_T...) \
225 CCC_private_flat_priority_queue_update_with( \
226 flat_priority_queue_pointer, T_pointer, increase_closure_over_T)
229#define CCC_private_flat_priority_queue_decrease_with( \
230 flat_priority_queue_pointer, T_pointer, decrease_closure_over_T...) \
231 CCC_private_flat_priority_queue_update_with( \
232 flat_priority_queue_pointer, T_pointer, decrease_closure_over_T)
Definition: private_buffer.h:34
Definition: private_flat_priority_queue.h:36
CCC_Type_comparator * compare
Definition: private_flat_priority_queue.h:43
CCC_Buffer buffer
Definition: private_flat_priority_queue.h:38
CCC_Order order
Definition: private_flat_priority_queue.h:41
CCC_Order
A three-way comparison for comparison functions.
Definition: types.h:171
CCC_Order CCC_Type_comparator(CCC_Type_comparator_context)
A callback function for comparing two elements in a container.
Definition: types.h:348