30#ifndef QUEUE_TEMPLATE_H
31#define QUEUE_TEMPLATE_H
39#define QUEUE_IMPL(word) QUEUE_COMB1(QUEUE_PREFIX,word)
40#define QUEUE_COMB1(pre, word) QUEUE_COMB2(pre, word)
41#define QUEUE_COMB2(pre, word) pre##word
46#error "QUEUE_T must be defined"
50#error "QUEUE_SIZE must be defined"
54#define QUEUE_KEY_T QUEUE_T
57#define QUEUE_NAME QUEUE_COMB1(QUEUE_COMB1(queue,_), QUEUE_T)
58#define QUEUE_PREFIX QUEUE_COMB1(QUEUE_NAME, _)
60#define QUEUE_init QUEUE_IMPL(init)
61#define QUEUE_clear QUEUE_IMPL(clear)
62#define QUEUE_size QUEUE_IMPL(size)
63#define QUEUE_empty QUEUE_IMPL(empty)
64#define QUEUE_has_space QUEUE_IMPL(has_space)
65#define QUEUE_front QUEUE_IMPL(front)
66#define QUEUE_back QUEUE_IMPL(back)
67#define QUEUE_next QUEUE_IMPL(next)
68#define QUEUE_enqueue QUEUE_IMPL(enqueue)
69#define QUEUE_dequeue QUEUE_IMPL(dequeue)
70#define QUEUE_delete QUEUE_IMPL(delete)
71#define QUEUE_remove QUEUE_IMPL(remove)
72#define QUEUE_replace QUEUE_IMPL(replace)
73#define QUEUE_search QUEUE_IMPL(search)
138 size_t next_index = item + 1 - queue->
items;
139 return next_index < queue->
next ? item + 1 : NULL;
144 ? item + 1 - queue->
items
146 return next_index > queue->
front || next_index < queue->
next
147 ? &queue->
items[next_index] : NULL;
161 queue->
next = new_next;
187 size_t array_index = item - queue->
items;
193 && (array_index < queue->front || array_index >= queue->
next))
197 && (array_index >= queue->
next && array_index < queue->front))
203 size_t write_index = array_index;
204 for (
size_t read_index = (array_index + 1) %
QUEUE_SIZE;
205 read_index != queue->
next;
208 queue->
items[write_index] = queue->
items[read_index];
211 queue->
next = write_index;
229 for (
size_t read_index = write_index;
230 read_index != queue->
next;
232 if (read_index != write_index) {
234 queue->
items[write_index] = queue->
items[read_index];
241 queue->
next = write_index;
246 for (
size_t index = queue->
front;
247 index != queue->
next;
250 queue->
items[index] = item;
258 for (
size_t index = queue->
front;
259 index != queue->
next;
262 return &queue->
items[index];
277#undef QUEUE_has_space
#define unlikely(expr)
Definition: dlb_common.h:29
#define QUEUE_replace
Definition: queue_template.h:72
#define QUEUE_search
Definition: queue_template.h:73
#define QUEUE_has_space
Definition: queue_template.h:64
#define QUEUE_dequeue
Definition: queue_template.h:69
#define QUEUE_enqueue
Definition: queue_template.h:68
#define QUEUE_front
Definition: queue_template.h:65
#define QUEUE_next
Definition: queue_template.h:67
#define QUEUE_back
Definition: queue_template.h:66
#define QUEUE_clear
Definition: queue_template.h:61
#define QUEUE_init
Definition: queue_template.h:60
#define QUEUE_size
Definition: queue_template.h:62
#define QUEUE_empty
Definition: queue_template.h:63
#define QUEUE_KEY_T
Definition: queue_template.h:54
#define QUEUE_NAME
Definition: queue_template.h:57
#define QUEUE_delete
Definition: queue_template.h:70
#define QUEUE_remove
Definition: queue_template.h:71
@ QUEUE_SIZE
Definition: shmem_async.c:38
#define QUEUE_T
Definition: shmem_cpuinfo.c:63
Definition: queue_template.h:82
size_t front
Definition: queue_template.h:84
QUEUE_T items[QUEUE_SIZE]
Definition: queue_template.h:83
size_t capacity
Definition: queue_template.h:86
size_t next
Definition: queue_template.h:85