diff --git a/core/include/blue/core/queue.h b/core/include/blue/core/queue.h index 441a27a..253d37a 100644 --- a/core/include/blue/core/queue.h +++ b/core/include/blue/core/queue.h @@ -35,24 +35,24 @@ static inline void b_queue_init(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) { - return q->q_first; + return q ? q->q_first : NULL; } 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) { - return entry->qe_next; + return entry ? entry->qe_next : NULL; } 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); @@ -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_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_all(b_queue *q); diff --git a/core/queue.c b/core/queue.c index 048c134..a914c1f 100644 --- a/core/queue.c +++ b/core/queue.c @@ -102,6 +102,27 @@ struct b_queue_entry *b_queue_pop_back(struct b_queue *q) 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) { if (!entry) {