core: queue: implement moving queue entries
this works exactly the same as moving btree nodes.
This commit is contained in:
@@ -35,24 +35,24 @@ static inline void b_queue_init(b_queue *q)
|
|||||||
}
|
}
|
||||||
static inline bool b_queue_empty(const b_queue *q)
|
static inline bool b_queue_empty(const b_queue *q)
|
||||||
{
|
{
|
||||||
return q->q_first == NULL;
|
return q ? (q->q_first == NULL) : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline b_queue_entry *b_queue_first(const b_queue *q)
|
static inline b_queue_entry *b_queue_first(const b_queue *q)
|
||||||
{
|
{
|
||||||
return q->q_first;
|
return q ? q->q_first : NULL;
|
||||||
}
|
}
|
||||||
static inline b_queue_entry *b_queue_last(const b_queue *q)
|
static inline b_queue_entry *b_queue_last(const b_queue *q)
|
||||||
{
|
{
|
||||||
return q->q_last;
|
return q ? q->q_last : NULL;
|
||||||
}
|
}
|
||||||
static inline b_queue_entry *b_queue_next(const b_queue_entry *entry)
|
static inline b_queue_entry *b_queue_next(const b_queue_entry *entry)
|
||||||
{
|
{
|
||||||
return entry->qe_next;
|
return entry ? entry->qe_next : NULL;
|
||||||
}
|
}
|
||||||
static inline b_queue_entry *b_queue_prev(const b_queue_entry *entry)
|
static inline b_queue_entry *b_queue_prev(const b_queue_entry *entry)
|
||||||
{
|
{
|
||||||
return entry->qe_prev;
|
return entry ? entry->qe_prev : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLUE_API b_type b_queue_iterator_get_type(void);
|
BLUE_API b_type b_queue_iterator_get_type(void);
|
||||||
@@ -70,6 +70,7 @@ BLUE_API void b_queue_push_back(b_queue *q, b_queue_entry *entry);
|
|||||||
BLUE_API b_queue_entry *b_queue_pop_front(b_queue *q);
|
BLUE_API b_queue_entry *b_queue_pop_front(b_queue *q);
|
||||||
BLUE_API b_queue_entry *b_queue_pop_back(b_queue *q);
|
BLUE_API b_queue_entry *b_queue_pop_back(b_queue *q);
|
||||||
|
|
||||||
|
BLUE_API void b_queue_move(b_queue *q, b_queue_entry *dest, b_queue_entry *src);
|
||||||
BLUE_API void b_queue_delete(b_queue *q, b_queue_entry *entry);
|
BLUE_API void b_queue_delete(b_queue *q, b_queue_entry *entry);
|
||||||
BLUE_API void b_queue_delete_all(b_queue *q);
|
BLUE_API void b_queue_delete_all(b_queue *q);
|
||||||
|
|
||||||
|
|||||||
21
core/queue.c
21
core/queue.c
@@ -102,6 +102,27 @@ struct b_queue_entry *b_queue_pop_back(struct b_queue *q)
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void b_queue_move(b_queue *q, b_queue_entry *dest, b_queue_entry *src)
|
||||||
|
{
|
||||||
|
if (src->qe_next) {
|
||||||
|
src->qe_next->qe_prev = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (src->qe_prev) {
|
||||||
|
src->qe_prev->qe_next = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q->q_first == src) {
|
||||||
|
q->q_first = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q->q_last == src) {
|
||||||
|
q->q_last = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
memmove(dest, src, sizeof *src);
|
||||||
|
}
|
||||||
|
|
||||||
void b_queue_delete(struct b_queue *q, struct b_queue_entry *entry)
|
void b_queue_delete(struct b_queue *q, struct b_queue_entry *entry)
|
||||||
{
|
{
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
|
|||||||
Reference in New Issue
Block a user