diff --git a/src/queue.c b/src/queue.c index 0ee814e..3ad927e 100644 --- a/src/queue.c +++ b/src/queue.c @@ -12,6 +12,11 @@ void queue_node_init(queue_node_t* node) { node->next = node; } +static inline void _queue_detach(queue_node_t* node) { + node->prev->next = node->next; + node->next->prev = node->prev; +} + queue_node_t* queue_first(const queue_t* queue) { return !queue_empty(queue) ? queue->head.next : NULL; } @@ -34,11 +39,19 @@ void queue_append(queue_t* queue, queue_node_t* node) { queue->head.prev = node; } +void queue_move_first(queue_t* queue, queue_node_t* node) { + _queue_detach(node); + queue_prepend(queue, node); +} + +void queue_move_last(queue_t* queue, queue_node_t* node) { + _queue_detach(node); + queue_append(queue, node); +} + void queue_remove(queue_node_t* node) { - node->prev->next = node->next; - node->next->prev = node->prev; - node->prev = node; - node->next = node; + _queue_detach(node); + queue_node_init(node); } bool queue_empty(const queue_t* queue) { diff --git a/src/queue.h b/src/queue.h index 4061b0b..ce30a6d 100644 --- a/src/queue.h +++ b/src/queue.h @@ -24,6 +24,8 @@ EPOLL_INTERNAL queue_node_t* queue_last(const queue_t* queue); EPOLL_INTERNAL void queue_prepend(queue_t* queue, queue_node_t* node); EPOLL_INTERNAL void queue_append(queue_t* queue, queue_node_t* node); +EPOLL_INTERNAL void queue_move_first(queue_t* queue, queue_node_t* node); +EPOLL_INTERNAL void queue_move_last(queue_t* queue, queue_node_t* node); EPOLL_INTERNAL void queue_remove(queue_node_t* node); EPOLL_INTERNAL bool queue_empty(const queue_t* queue);