cctools
priority_queue.h
Go to the documentation of this file.
1 /*
2 Copyright (C) 2024 The University of Notre Dame
3 This software is distributed under the GNU General Public License.
4 See the file COPYING for details.
5 */
6 
7 #ifndef PRIORITY_QUEUE_H
8 #define PRIORITY_QUEUE_H
9 
97 struct priority_queue *priority_queue_create(int init_capacity);
98 
103 int priority_queue_size(struct priority_queue *pq);
104 
112 int priority_queue_push(struct priority_queue *pq, void *data, double priority);
113 
118 void *priority_queue_pop(struct priority_queue *pq);
119 
125 void *priority_queue_peek_top(struct priority_queue *pq);
126 
133 void *priority_queue_peek_at(struct priority_queue *pq, int index);
134 
140 double priority_queue_get_priority(struct priority_queue *pq, int index);
141 
148 int priority_queue_update_priority(struct priority_queue *pq, void *data, double new_priority);
149 
155 int priority_queue_find_idx(struct priority_queue *pq, void *data);
156 
163 int priority_queue_static_next(struct priority_queue *pq);
164 
169 void priority_queue_base_reset(struct priority_queue *pq);
170 
175 int priority_queue_base_next(struct priority_queue *pq);
176 
184 void priority_queue_rotate_reset(struct priority_queue *pq);
185 
190 int priority_queue_rotate_next(struct priority_queue *pq);
191 
197 int priority_queue_remove(struct priority_queue *pq, int idx);
198 
202 void priority_queue_delete(struct priority_queue *pq);
203 
234 /* Iterate from begining to the end every time starts. */
235 #define PRIORITY_QUEUE_BASE_ITERATE( pq, idx, data, iter_count, iter_depth ) \
236  iter_count = 0; \
237  priority_queue_base_reset(pq); \
238  while ((iter_count < iter_depth) && ((idx = priority_queue_base_next(pq)) >= 0) && (data = priority_queue_peek_at(pq, idx)) && (iter_count += 1))
239 
240 /* Iterate from last position, never reset. */
241 #define PRIORITY_QUEUE_STATIC_ITERATE( pq, idx, data, iter_count, iter_depth ) \
242  iter_count = 0; \
243  while ((iter_count < iter_depth) && ((idx = priority_queue_static_next(pq)) >= 0) && (data = priority_queue_peek_at(pq, idx)) && (iter_count += 1))
244 
245 /* Iterate from last position, reset to the begining when needed. */
246 #define PRIORITY_QUEUE_ROTATE_ITERATE( pq, idx, data, iter_count, iter_depth ) \
247  iter_count = 0; \
248  while ((iter_count < iter_depth) && ((idx = priority_queue_rotate_next(pq)) >= 0) && (data = priority_queue_peek_at(pq, idx)) && (iter_count += 1))
249 
250 #endif
priority_queue_peek_top
void * priority_queue_peek_top(struct priority_queue *pq)
Get the element with the highest priority from a priority queue.
priority_queue_create
struct priority_queue * priority_queue_create(int init_capacity)
Create a new priority queue.
priority_queue_update_priority
int priority_queue_update_priority(struct priority_queue *pq, void *data, double new_priority)
Update the priority of an element in a priority queue.
priority_queue_get_priority
double priority_queue_get_priority(struct priority_queue *pq, int index)
Get the priority of an element at a specified index.
priority_queue_rotate_next
int priority_queue_rotate_next(struct priority_queue *pq)
Advance the rotate_cursor to the next element and return the index.
priority_queue_static_next
int priority_queue_static_next(struct priority_queue *pq)
Advance the static_cursor to the next element and return the index.
priority_queue_delete
void priority_queue_delete(struct priority_queue *pq)
Delete a priority queue.
priority_queue_peek_at
void * priority_queue_peek_at(struct priority_queue *pq, int index)
Get an element from a priority queue by a specified index.
priority_queue_base_reset
void priority_queue_base_reset(struct priority_queue *pq)
Reset the base_cursor to 0.
priority_queue_size
int priority_queue_size(struct priority_queue *pq)
Count the elements in a priority queue.
priority_queue_base_next
int priority_queue_base_next(struct priority_queue *pq)
Advance the base_cursor to the next element and return the index.
priority_queue_pop
void * priority_queue_pop(struct priority_queue *pq)
Pop the element with the highest priority from a priority queue.
priority_queue_find_idx
int priority_queue_find_idx(struct priority_queue *pq, void *data)
Find the index of an element in a priority queue.
priority_queue_rotate_reset
void priority_queue_rotate_reset(struct priority_queue *pq)
Reset the rotate_cursor to 0.
priority_queue_remove
int priority_queue_remove(struct priority_queue *pq, int idx)
Remove the element with the specified index from a priority queue.
priority_queue_push
int priority_queue_push(struct priority_queue *pq, void *data, double priority)
Push an element into a priority queue.