C Container Collection (CCC)
Loading...
Searching...
No Matches
private_flat_priority_queue.h
1
16#ifndef CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
17#define CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H
18
20#include <assert.h>
21#include <stddef.h>
24#include "../buffer.h"
25#include "../types.h"
26
27/* NOLINTBEGIN(readability-identifier-naming) */
28
36{
44};
45
46/*======================== Private Interface =========================*/
47
49size_t
50CCC_private_flat_priority_queue_bubble_up(struct CCC_Flat_priority_queue *,
51 void *, size_t);
53void CCC_private_flat_priority_queue_in_place_heapify(
54 struct CCC_Flat_priority_queue *, size_t, void *);
56void *
57CCC_private_flat_priority_queue_update_fixup(struct CCC_Flat_priority_queue *,
58 void *, void *);
59
60/*====================== Macro Implementations ========================*/
61
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) \
66 { \
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), \
72 }
73
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) \
78 (__extension__({ \
79 typeof(*( \
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; \
91 }))
92
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...) \
97 (__extension__({ \
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, \
104 }; \
105 if (private_flat_priority_queue.buffer.count) \
106 { \
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}); \
111 } \
112 private_flat_priority_queue; \
113 }))
114
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) \
119 (__extension__({ \
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, \
123 private_capacity), \
124 .order = (private_order), \
125 .compare = (private_compare), \
126 }; \
127 private_flat_priority_queue; \
128 }))
129
131#define CCC_private_flat_priority_queue_with_compound_literal( \
132 private_order, private_compare, private_compound_literal) \
133 { \
134 .buffer \
135 = CCC_buffer_with_compound_literal(0, private_compound_literal), \
136 .order = (private_order), \
137 .compare = (private_compare), \
138 }
139
141#define CCC_private_flat_priority_queue_with_context_compound_literal( \
142 private_order, private_compare, private_context, private_compound_literal) \
143 { \
144 .buffer = CCC_buffer_with_context_compound_literal( \
145 private_context, 0, private_compound_literal), \
146 .order = (private_order), \
147 .compare = (private_compare), \
148 }
149
153#define CCC_private_flat_priority_queue_emplace(flat_priority_queue, \
154 type_compound_literal...) \
155 (__extension__({ \
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) \
161 { \
162 *private_flat_priority_queue_res = type_compound_literal; \
163 if (private_flat_priority_queue->buffer.count > 1) \
164 { \
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)); \
171 } \
172 else \
173 { \
174 private_flat_priority_queue_res \
175 = CCC_buffer_at(&private_flat_priority_queue->buffer, 0); \
176 } \
177 } \
178 private_flat_priority_queue_res; \
179 }))
180
183#define CCC_private_flat_priority_queue_update_with( \
184 flat_priority_queue_pointer, T_pointer, update_closure_over_T...) \
185 (__extension__({ \
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) \
191 && T) \
192 { \
193 {update_closure_over_T} T \
194 = CCC_private_flat_priority_queue_update_fixup( \
195 private_flat_priority_queue, T, &(typeof(*T_pointer)){0}); \
196 } \
197 T; \
198 }))
199
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)
205
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)
211
212/* NOLINTEND(readability-identifier-naming) */
213
214#endif /* CCC_PRIVATE_FLAT_PRIORITY_QUEUE_H */
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