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