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; \
133#define CCC_private_flat_priority_queue_emplace(flat_priority_queue, \
134 type_compound_literal...) \
136 struct CCC_Flat_priority_queue *private_flat_priority_queue \
137 = (flat_priority_queue); \
138 typeof(type_compound_literal) *private_flat_priority_queue_res \
139 = CCC_buffer_allocate_back(&private_flat_priority_queue->buffer); \
140 if (private_flat_priority_queue_res) \
142 *private_flat_priority_queue_res = type_compound_literal; \
143 if (private_flat_priority_queue->buffer.count > 1) \
145 private_flat_priority_queue_res = CCC_buffer_at( \
146 &private_flat_priority_queue->buffer, \
147 CCC_private_flat_priority_queue_bubble_up( \
148 private_flat_priority_queue, \
149 &(typeof(type_compound_literal)){0}, \
150 private_flat_priority_queue->buffer.count - 1)); \
154 private_flat_priority_queue_res \
155 = CCC_buffer_at(&private_flat_priority_queue->buffer, 0); \
158 private_flat_priority_queue_res; \
163#define CCC_private_flat_priority_queue_update_with( \
164 flat_priority_queue_pointer, T_pointer, update_closure_over_T...) \
166 struct CCC_Flat_priority_queue *const private_flat_priority_queue \
167 = (flat_priority_queue_pointer); \
168 typeof(*T_pointer) *T = (T_pointer); \
169 if (private_flat_priority_queue \
170 && !CCC_buffer_is_empty(&private_flat_priority_queue->buffer) \
173 {update_closure_over_T} T \
174 = CCC_private_flat_priority_queue_update_fixup( \
175 private_flat_priority_queue, T, &(typeof(*T_pointer)){0}); \
181#define CCC_private_flat_priority_queue_increase_with( \
182 flat_priority_queue_pointer, T_pointer, increase_closure_over_T...) \
183 CCC_private_flat_priority_queue_update_with( \
184 flat_priority_queue_pointer, T_pointer, increase_closure_over_T)
187#define CCC_private_flat_priority_queue_decrease_with( \
188 flat_priority_queue_pointer, T_pointer, decrease_closure_over_T...) \
189 CCC_private_flat_priority_queue_update_with( \
190 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