1
2 #ifdef HAVE_CONFIG_H
3 #include <config.h>
4 #endif
5
6 #include <schroedinger/schroutils.h>
7 #include <schroedinger/schroqueue.h>
8 #include <schroedinger/schrodebug.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 SchroQueue *
schro_queue_new(int size,SchroQueueFreeFunc free_func)13 schro_queue_new (int size, SchroQueueFreeFunc free_func)
14 {
15 SchroQueue *queue;
16
17 queue = schro_malloc0 (sizeof (*queue));
18
19 queue->size = size;
20 queue->free = free_func;
21
22 queue->elements = schro_malloc0 (size * sizeof (SchroQueueElement));
23
24 return queue;
25 }
26
27 void
schro_queue_free(SchroQueue * queue)28 schro_queue_free (SchroQueue * queue)
29 {
30 int i;
31
32 if (queue->free) {
33 for (i = 0; i < queue->n; i++) {
34 queue->free (queue->elements[i].data, queue->elements[i].picture_number);
35 }
36 }
37
38 schro_free (queue->elements);
39 schro_free (queue);
40 }
41
42 void
schro_queue_add(SchroQueue * queue,void * data,SchroPictureNumber picture_number)43 schro_queue_add (SchroQueue * queue, void *data,
44 SchroPictureNumber picture_number)
45 {
46 SCHRO_ASSERT (queue->n < queue->size);
47
48 queue->elements[queue->n].data = data;
49 queue->elements[queue->n].picture_number = picture_number;
50 queue->n++;
51 }
52
53 void *
schro_queue_find(SchroQueue * queue,SchroPictureNumber picture_number)54 schro_queue_find (SchroQueue * queue, SchroPictureNumber picture_number)
55 {
56 int i;
57
58 for (i = 0; i < queue->n; i++) {
59 if (queue->elements[i].picture_number == picture_number) {
60 return queue->elements[i].data;
61 }
62 }
63
64 return NULL;
65 }
66
67 void
schro_queue_delete(SchroQueue * queue,SchroPictureNumber picture_number)68 schro_queue_delete (SchroQueue * queue, SchroPictureNumber picture_number)
69 {
70 int i;
71
72 for (i = 0; i < queue->n; i++) {
73 if (queue->elements[i].picture_number == picture_number) {
74 if (queue->free) {
75 queue->free (queue->elements[i].data,
76 queue->elements[i].picture_number);
77 }
78 memmove (queue->elements + i, queue->elements + i + 1,
79 sizeof (SchroQueueElement) * (queue->n - i - 1));
80 queue->n--;
81 return;
82 }
83 }
84 }
85
86 #ifdef unused
87 void *
schro_queue_remove(SchroQueue * queue,SchroPictureNumber picture_number)88 schro_queue_remove (SchroQueue * queue, SchroPictureNumber picture_number)
89 {
90 int i;
91 void *ret;
92
93 for (i = 0; i < queue->n; i++) {
94 if (queue->elements[i].picture_number == picture_number) {
95 ret = queue->elements[i].data;
96 memmove (queue->elements + i, queue->elements + i + 1,
97 sizeof (SchroQueueElement) * (queue->n - i - 1));
98 queue->n--;
99 return ret;
100 }
101 }
102
103 return NULL;
104 }
105 #endif
106
107 #ifdef unused
108 void
schro_queue_clear(SchroQueue * queue)109 schro_queue_clear (SchroQueue * queue)
110 {
111 int i;
112
113 for (i = 0; i < queue->n; i++) {
114 if (queue->free) {
115 queue->free (queue->elements[i].data, queue->elements[i].picture_number);
116 }
117 }
118 queue->n = 0;
119 }
120 #endif
121
122 void
schro_queue_pop(SchroQueue * queue)123 schro_queue_pop (SchroQueue * queue)
124 {
125 if (queue->n == 0)
126 return;
127
128 if (queue->free) {
129 queue->free (queue->elements[0].data, queue->elements[0].picture_number);
130 }
131 memmove (queue->elements, queue->elements + 1,
132 sizeof (SchroQueueElement) * (queue->n - 1));
133 queue->n--;
134 }
135
136 void *
schro_queue_peek(SchroQueue * queue)137 schro_queue_peek (SchroQueue * queue)
138 {
139 if (queue->n == 0)
140 return NULL;
141
142 return queue->elements[0].data;
143 }
144
145 void *
schro_queue_pull(SchroQueue * queue)146 schro_queue_pull (SchroQueue * queue)
147 {
148 void *ret;
149
150 if (queue->n == 0)
151 return NULL;
152
153 ret = queue->elements[0].data;
154 memmove (queue->elements, queue->elements + 1,
155 sizeof (SchroQueueElement) * (queue->n - 1));
156 queue->n--;
157
158 return ret;
159 }
160
161 int
schro_queue_is_full(SchroQueue * queue)162 schro_queue_is_full (SchroQueue * queue)
163 {
164 return (queue->n == queue->size);
165 }
166
167 int
schro_queue_slots_available(SchroQueue * queue)168 schro_queue_slots_available (SchroQueue * queue)
169 {
170 return queue->size - queue->n;
171 }
172
173 int
schro_queue_is_empty(SchroQueue * queue)174 schro_queue_is_empty (SchroQueue * queue)
175 {
176 return (queue->n == 0);
177 }
178