-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathqueue.h
More file actions
42 lines (35 loc) · 1.36 KB
/
Copy pathqueue.h
File metadata and controls
42 lines (35 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef QUEUE_H
#define QUEUE_H
#include <stdlib.h>
void *queue_initf(void *a, size_t elemsize, size_t len);
#ifdef __cplusplus
template <class T> static T *queue_init_wrapper(T *a, size_t elemsize, size_t len) {
return (T*)queue_initf(a, elemsize, len);
}
#else
#define queue_init_wrapper queue_initf
#endif
#define queue_init(a, n) ((a) = queue_init_wrapper((a), sizeof(*(a)), (n)))
#define queue_full(a) (queue_len((a)) == (long)queue_header(a)->cap - 1)
#define queue_empty(a) (queue_header(a)->front == queue_header(a)->back)
#define queue_put(a, elem) \
(queue_full(a) ? NULL \
: (a[queue_header(a)->back] = (elem), \
queue_header(a)->back = \
(queue_header(a)->back + 1) % queue_header(a)->cap, \
(a)))
#define queue_front(a) (a[queue_header(a)->front])
#define queue_fronti(a) (queue_header(a)->front)
#define queue_backi(a) (queue_header(a)->back)
#define queue_cap(a) (queue_header(a)->cap)
#define queue_pop queue_popf
#define queue_header(t) ((Queue *)(t) - 1)
typedef struct Queue {
size_t cap;
long front;
long back;
} Queue;
void queue_free(void *a);
long queue_len(const void *a);
void queue_popf(void *a);
#endif