queue: add internal queue_move_first() and queue_move_last() APIs

This commit is contained in:
Bert Belder 2017-09-14 16:37:31 +02:00
parent 34df608b98
commit 048d2cc363
2 changed files with 19 additions and 4 deletions

View File

@ -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) {

View File

@ -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);