cdcontainers  0.1.1
Library of data containers and collections for C programming language.
priority-queue.h
Go to the documentation of this file.
1 // The MIT License (MIT)
2 // Copyright (c) 2017 Maksim Andrianov
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to
6 // deal in the Software without restriction, including without limitation the
7 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 // sell copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 // IN THE SOFTWARE.
27 #ifndef CDCONTAINERS_INCLUDE_CDCONTAINERS_PRIORITY_QUEUE_H
28 #define CDCONTAINERS_INCLUDE_CDCONTAINERS_PRIORITY_QUEUE_H
29 
30 #include <cdcontainers/common.h>
31 #include <cdcontainers/status.h>
33 
34 #include <assert.h>
35 #include <stdarg.h>
36 #include <stdbool.h>
37 #include <stdlib.h>
38 
45  void *container;
47 };
48 
58  const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q,
59  struct cdc_data_info *info);
60 
71  const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q,
72  struct cdc_data_info *info, ...);
73 
84  const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q,
85  struct cdc_data_info *info, va_list args);
86 
92 
93 // Element access
100 static inline void *cdc_priority_queue_top(struct cdc_priority_queue *q)
101 {
102  assert(q != NULL);
103 
104  return q->table->top(q->container);
105 }
106 
107 // Capacity
114 static inline bool cdc_priority_queue_empty(struct cdc_priority_queue *q)
115 {
116  assert(q != NULL);
117 
118  return q->table->empty(q->container);
119 }
120 
126 static inline size_t cdc_priority_queue_size(struct cdc_priority_queue *q)
127 {
128  assert(q != NULL);
129 
130  return q->table->size(q->container);
131 }
132 
133 // Modifiers
142  struct cdc_priority_queue *q, void *elem)
143 {
144  assert(q != NULL);
145 
146  return q->table->push(q->container, elem);
147 }
148 
153 static inline void cdc_priority_queue_pop(struct cdc_priority_queue *q)
154 {
155  assert(q != NULL);
156 
157  q->table->pop(q->container);
158 }
159 
167  struct cdc_priority_queue *b);
168 
169 // Short names
170 #ifdef CDC_USE_SHORT_NAMES
171 typedef struct cdc_priority_queue priority_queue_t;
172 
173 #define priority_queue_ctor(...) cdc_priority_queue_ctor(__VA_ARGS__)
174 #define priority_queue_ctorl(...) cdc_priority_queue_ctorl(__VA_ARGS__)
175 #define priority_queue_ctorv(...) cdc_priority_queue_ctorv(__VA_ARGS__)
176 #define priority_queue_dtor(...) cdc_priority_queue_dtor(__VA_ARGS__)
177 
178 // Element access
179 #define priority_queue_top(...) cdc_priority_queue_top(__VA_ARGS__)
180 
181 // Capacity
182 #define priority_queue_empty(...) cdc_priority_queue_empty(__VA_ARGS__)
183 #define priority_queue_size(...) cdc_priority_queue_size(__VA_ARGS__)
184 
185 // Modifiers
186 #define priority_queue_push(...) cdc_priority_queue_push(__VA_ARGS__)
187 #define priority_queue_pop(...) cdc_priority_queue_pop(__VA_ARGS__)
188 #define priority_queue_swap(...) cdc_priority_queue_swap(__VA_ARGS__)
189 #endif
190 
191 #endif // CDCONTAINERS_INCLUDE_CDCONTAINERS_PRIORITY_QUEUE_H
The cdc_priority_queue_table is a priority queue interface.
The cdc_priority_queue struct.
Definition: priority-queue.h:44
The cdc_priority_queue_table struct.
Definition: ipqueue.h:41
enum cdc_stat cdc_priority_queue_ctor(const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q, struct cdc_data_info *info)
Constructs an empty priority queue.
static bool cdc_priority_queue_empty(struct cdc_priority_queue *q)
Returns true if the priority queue has size 0; otherwise returns false.
Definition: priority-queue.h:114
enum cdc_stat cdc_priority_queue_ctorv(const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q, struct cdc_data_info *info, va_list args)
Constructs a priority queue, initialized by args. The last item must be NULL.
enum cdc_stat(* push)(void *cntr, void *elem)
Definition: ipqueue.h:48
void cdc_priority_queue_dtor(struct cdc_priority_queue *q)
Destroys the priority queue.
const struct cdc_priority_queue_table * table
Definition: priority-queue.h:46
size_t(* size)(void *cntr)
Definition: ipqueue.h:47
void *(* top)(void *cntr)
Definition: ipqueue.h:45
static void * cdc_priority_queue_top(struct cdc_priority_queue *q)
Returns a pointer to the priority queue&#39;s top item. This function assumes that the priority queue isn...
Definition: priority-queue.h:100
enum cdc_stat cdc_priority_queue_ctorl(const struct cdc_priority_queue_table *table, struct cdc_priority_queue **q, struct cdc_data_info *info,...)
Constructs a priority queue, initialized by an arbitrary number of pointers. The last item must be NU...
cdc_stat
Definition: status.h:24
void * container
Definition: priority-queue.h:45
void(* pop)(void *cntr)
Definition: ipqueue.h:49
void cdc_priority_queue_swap(struct cdc_priority_queue *a, struct cdc_priority_queue *b)
Swaps priority queues a and b. This operation is very fast and never fails.
static enum cdc_stat cdc_priority_queue_push(struct cdc_priority_queue *q, void *elem)
Adds element elem to the priority queue.
Definition: priority-queue.h:141
static void cdc_priority_queue_pop(struct cdc_priority_queue *q)
Removes the top element.
Definition: priority-queue.h:153
The cdc_data_info struct used to initialize contaners.
Definition: common.h:71
bool(* empty)(void *cntr)
Definition: ipqueue.h:46
static size_t cdc_priority_queue_size(struct cdc_priority_queue *q)
Returns the number of items in the priority queue.
Definition: priority-queue.h:126