open5gs/lib/core/include/core_queue.h

41 lines
1.1 KiB
C

#ifndef __CORE_QUEUE_H__
#define __CORE_QUEUE_H__
#include "core.h"
#define que_declare(__name, __type, __size) \
struct { \
int head, tail, size, used; \
__type pool[(__size)]; \
} __name
#define que_init(__pname, __size) \
((__pname)->head = (__pname)->tail = 0, \
(__pname)->used = 0, \
(__pname)->size = __size)
#define que_push(__pname, __ptr_node) \
((__pname)->used == ((__pname)->size) ? -1 : \
(((__pname)->pool[(__pname)->head] = *(__ptr_node), \
(__pname)->head = ((__pname)->head + 1) % ((__pname)->size), \
++(__pname)->used)))
#define que_pop(__pname, __ptr_node) \
((__pname)->used == 0 ? -1 : \
((*(__ptr_node) = (__pname)->pool[(__pname)->tail], \
(__pname)->tail = ((__pname)->tail + 1) % ((__pname)->size), \
--(__pname)->used)))
#define que_is_empty(__pname) ((__pname)->used == 0)
#define que_is_full(__pname) ((__pname)->used == (__pname)->size)
#define que_size(__pname) ((__pname)->size)
#define que_used(__pname) ((__pname)->used)
#define que_avail(__pname) (que_size(__pname) - que_used(__pname))
#endif /* ! __CORE_QUEUE_H__ */