mirror of
https://gitee.com/apaki/unicstl.git
synced 2026-05-28 22:54:19 +08:00
221 lines
5.0 KiB
C
221 lines
5.0 KiB
C
/**
|
|
* @file queue.c
|
|
* @author wenjf (Orig5826@163.com)
|
|
* @brief
|
|
* @version 0.1
|
|
* @date 2024-06-23
|
|
*
|
|
* @copyright Copyright (c) 2024
|
|
*
|
|
*/
|
|
#include "queue.h"
|
|
|
|
static bool queue_push(struct _queue* self, void* obj)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->push_back(self->_deque, obj);
|
|
}
|
|
|
|
static bool queue_pop(struct _queue* self, void* obj)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->pop_front(self->_deque, obj);
|
|
}
|
|
|
|
static bool queue_back(struct _queue* self, void* obj)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->back(self->_deque, obj);
|
|
return true;
|
|
}
|
|
|
|
static bool queue_front(struct _queue* self, void* obj)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->front(self->_deque, obj);
|
|
}
|
|
|
|
static size_t queue_resize(struct _queue* self, size_t capacity)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->resize(self->_deque, capacity);
|
|
}
|
|
|
|
static size_t queue_size(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->size(self->_deque);
|
|
}
|
|
|
|
static size_t queue_capacity(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
|
|
return self->_deque->capacity(self->_deque);
|
|
}
|
|
|
|
static bool queue_empty(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->empty(self->_deque);
|
|
}
|
|
|
|
static bool queue_full(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->full(self->_deque);
|
|
}
|
|
|
|
static bool queue_clear(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
return self->_deque->clear(self->_deque);
|
|
}
|
|
|
|
|
|
static void queue_destory(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
deque_free(&self->_deque);
|
|
}
|
|
|
|
static void queue_print(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
|
|
self->_deque->print_obj = self->print_obj;
|
|
self->_deque->print(self->_deque);
|
|
}
|
|
|
|
static bool queue_iter_hasnext(struct _iterator* iter)
|
|
{
|
|
unicstl_assert(iter != NULL);
|
|
unicstl_assert(iter->_container != NULL);
|
|
|
|
queue_t self = (queue_t)iter->_container;
|
|
return self->_iter_deque->hasnext(self->_iter_deque);
|
|
}
|
|
|
|
static const void* queue_iter_next(struct _iterator* iter)
|
|
{
|
|
unicstl_assert(iter != NULL);
|
|
unicstl_assert(iter->_container != NULL);
|
|
|
|
queue_t self = (queue_t)iter->_container;
|
|
return self->_iter_deque->next(self->_iter_deque);
|
|
}
|
|
|
|
static iterator_t queue_iter(struct _queue* self)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
unicstl_assert(self->_deque != NULL);
|
|
deque_t deque = self->_deque;
|
|
self->_iter_deque = deque->iter(deque, DEQUE_FORWARD);
|
|
|
|
iterator_t iter = &self->_iter;
|
|
iter->_container = self;
|
|
|
|
iter->hasnext = queue_iter_hasnext;
|
|
iter->next = queue_iter_next;
|
|
return iter;
|
|
}
|
|
|
|
static bool queue_init(struct _queue * self, size_t obj_size, size_t capacity)
|
|
{
|
|
unicstl_assert(self != NULL);
|
|
|
|
// -------------------- private --------------------
|
|
self->_deque = deque_new(obj_size, capacity);
|
|
if(self->_deque == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//
|
|
self->_destory = queue_destory;
|
|
|
|
// -------------------- public --------------------
|
|
// kernel
|
|
self->push = queue_push;
|
|
self->pop = queue_pop;
|
|
self->back = queue_back;
|
|
self->front = queue_front;
|
|
|
|
// base
|
|
self->resize = queue_resize;
|
|
self->size = queue_size;
|
|
self->capacity = queue_capacity;
|
|
self->empty = queue_empty;
|
|
self->full = queue_full;
|
|
self->clear = queue_clear;
|
|
|
|
// iter
|
|
self->iter = queue_iter;
|
|
|
|
// -------------------- default --------------------
|
|
self->print_obj = default_print_obj;
|
|
|
|
// -------------------- debug --------------------
|
|
self->print = queue_print;
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @brief 创建队列对象
|
|
* 基于动态数组
|
|
*
|
|
* @param obj_size 元素大小
|
|
* @param capacity 容量
|
|
*
|
|
* @return queue_t 队列指针
|
|
*/
|
|
queue_t queue_new(size_t obj_size, size_t capacity)
|
|
{
|
|
struct _queue * queue = NULL;
|
|
queue = (struct _queue *)unicstl_malloc(sizeof(struct _queue));
|
|
if(queue == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if(queue_init(queue, obj_size, capacity) != true)
|
|
{
|
|
free(queue);
|
|
return NULL;
|
|
}
|
|
return queue;
|
|
}
|
|
|
|
/**
|
|
* @brief 释放队列对象
|
|
*
|
|
* @param queue 队列指针地址
|
|
*
|
|
*/
|
|
void queue_free(queue_t* queue)
|
|
{
|
|
unicstl_assert(queue != NULL);
|
|
if(queue != NULL && *queue != NULL)
|
|
{
|
|
if((*queue)->_destory != NULL)
|
|
{
|
|
(*queue)->_destory(*queue);
|
|
}
|
|
free(*queue);
|
|
*queue = NULL;
|
|
}
|
|
}
|