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_data_pointer, private_type_name, private_order, private_compare, \
65 private_allocate, private_context_data, private_capacity) \
67 .buffer = CCC_buffer_initialize( \
68 private_data_pointer, private_type_name, private_allocate, \
69 private_context_data, private_capacity), \
70 .order = (private_order), \
71 .compare = (private_compare), \
75#define CCC_private_flat_priority_queue_heapify_initialize( \
76 private_data_pointer, private_type_name, private_order, private_compare, \
77 private_allocate, private_context_data, private_capacity, private_size) \
80 private_data_pointer)) *private_flat_priority_queue_heapify_data \
81 = (private_data_pointer); \
82 struct CCC_Flat_priority_queue private_flat_priority_queue_heapify_res \
83 = CCC_private_flat_priority_queue_initialize( \
84 private_flat_priority_queue_heapify_data, private_type_name, \
85 private_order, private_compare, private_allocate, \
86 private_context_data, private_capacity); \
87 CCC_private_flat_priority_queue_in_place_heapify( \
88 &private_flat_priority_queue_heapify_res, (private_size), \
89 &(private_type_name){0}); \
90 private_flat_priority_queue_heapify_res; \
94#define CCC_private_flat_priority_queue_from( \
95 private_order, private_compare, private_allocate, private_context_data, \
96 private_optional_capacity, private_compound_literal_array...) \
98 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
99 .buffer = CCC_buffer_from(private_allocate, private_context_data, \
100 private_optional_capacity, \
101 private_compound_literal_array), \
102 .order = private_order, \
103 .compare = private_compare, \
105 if (private_flat_priority_queue.buffer.count) \
107 CCC_private_flat_priority_queue_in_place_heapify( \
108 &private_flat_priority_queue, \
109 private_flat_priority_queue.buffer.count, \
110 &(typeof(*private_compound_literal_array)){0}); \
112 private_flat_priority_queue; \
116#define CCC_private_flat_priority_queue_with_capacity( \
117 private_type_name, private_order, private_compare, private_allocate, \
118 private_context_data, private_capacity) \
120 struct CCC_Flat_priority_queue private_flat_priority_queue = { \
121 .buffer = CCC_buffer_with_capacity( \
122 private_type_name, private_allocate, private_context_data, \
124 .order = (private_order), \
125 .compare = (private_compare), \
127 private_flat_priority_queue; \
131#define CCC_private_flat_priority_queue_with_compound_literal( \
132 private_order, private_compare, private_compound_literal) \
135 = CCC_buffer_with_compound_literal(0, private_compound_literal), \
136 .order = (private_order), \
137 .compare = (private_compare), \
141#define CCC_private_flat_priority_queue_with_context_compound_literal( \
142 private_order, private_compare, private_context, private_compound_literal) \
144 .buffer = CCC_buffer_with_context_compound_literal( \
145 private_context, 0, private_compound_literal), \
146 .order = (private_order), \
147 .compare = (private_compare), \
153#define CCC_private_flat_priority_queue_emplace(flat_priority_queue, \
154 type_compound_literal...) \
156 struct CCC_Flat_priority_queue *private_flat_priority_queue \
157 = (flat_priority_queue); \
158 typeof(type_compound_literal) *private_flat_priority_queue_res \
159 = CCC_buffer_allocate_back(&private_flat_priority_queue->buffer); \
160 if (private_flat_priority_queue_res) \
162 *private_flat_priority_queue_res = type_compound_literal; \
163 if (private_flat_priority_queue->buffer.count > 1) \
165 private_flat_priority_queue_res = CCC_buffer_at( \
166 &private_flat_priority_queue->buffer, \
167 CCC_private_flat_priority_queue_bubble_up( \
168 private_flat_priority_queue, \
169 &(typeof(type_compound_literal)){0}, \
170 private_flat_priority_queue->buffer.count - 1)); \
174 private_flat_priority_queue_res \
175 = CCC_buffer_at(&private_flat_priority_queue->buffer, 0); \
178 private_flat_priority_queue_res; \
183#define CCC_private_flat_priority_queue_update_with( \
184 flat_priority_queue_pointer, T_pointer, update_closure_over_T...) \
186 struct CCC_Flat_priority_queue *const private_flat_priority_queue \
187 = (flat_priority_queue_pointer); \
188 typeof(*T_pointer) *T = (T_pointer); \
189 if (private_flat_priority_queue \
190 && !CCC_buffer_is_empty(&private_flat_priority_queue->buffer) \
193 {update_closure_over_T} T \
194 = CCC_private_flat_priority_queue_update_fixup( \
195 private_flat_priority_queue, T, &(typeof(*T_pointer)){0}); \
201#define CCC_private_flat_priority_queue_increase_with( \
202 flat_priority_queue_pointer, T_pointer, increase_closure_over_T...) \
203 CCC_private_flat_priority_queue_update_with( \
204 flat_priority_queue_pointer, T_pointer, increase_closure_over_T)
207#define CCC_private_flat_priority_queue_decrease_with( \
208 flat_priority_queue_pointer, T_pointer, decrease_closure_over_T...) \
209 CCC_private_flat_priority_queue_update_with( \
210 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