/
dqueue.c
79 lines (75 loc) · 5.56 KB
/
dqueue.c
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "dqueue.h"
#define DEFINE_DQUEUE_BODY(type) \
dqueue_##type* dqueue_init_##type() \
{ \
dqueue_##type *dqueue = x_alloc(sizeof(dqueue_##type)); \
dqueue->head = NULL; \
dqueue->tail = NULL; \
dqueue->size = 0; \
return dqueue; \
} \
\
void dqueue_push_##type(dqueue_##type *queue, type el) \
{ \
dqueue_entry_##type *entry = x_alloc(sizeof(dqueue_entry_##type)); \
entry->data = el; \
entry->next = queue->head; \
entry->prev = NULL; \
if (queue->head != NULL) { \
queue->head->prev = entry; \
} \
if (queue->tail == NULL) \
{ \
queue->tail = entry; \
} \
queue->head = entry; \
queue->size++; \
} \
\
type dqueue_pop_##type(dqueue_##type *queue) \
{ \
if (queue->head == NULL) \
{ \
return NULL; \
} \
dqueue_entry_##type *entry = queue->head; \
queue->head = entry->next; \
queue->size--; \
if (queue->size == 0) queue->tail = NULL; \
return entry->data; \
} \
\
type dqueue_peek_##type(dqueue_##type *queue) \
{ \
if (queue->head == NULL) \
{ \
return NULL; \
} \
return queue->head->data; \
} \
\
void dqueue_clear_##type(dqueue_##type *queue) \
{ \
queue->head = NULL; \
queue->tail = NULL; \
queue->size = 0; \
} \
\
void dqueue_add_##type(dqueue_##type *queue, type el) \
{ \
dqueue_entry_##type *entry = x_alloc(sizeof(dqueue_entry_##type)); \
entry->data = el; \
entry->next = NULL; \
entry->prev = queue->tail; \
if (queue->tail != NULL) { \
queue->tail->next = entry; \
} \
if (queue->head == NULL) \
{ \
queue->head = entry; \
} \
queue->tail = entry; \
queue->size++; \
} \
DEFINE_DQUEUE_BODY(object);
DEFINE_DQUEUE_BODY(string);