mirror of
https://gitee.com/Lamdonn/varch.git
synced 2025-12-07 01:06:41 +08:00
143 lines
3.7 KiB
C
143 lines
3.7 KiB
C
/*********************************************************************************************************
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* file description
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* \file queue.h
|
|
* \unit queue
|
|
* \brief This is a C language queue
|
|
* \author Lamdonn
|
|
* \version v1.0.0
|
|
* \license GPL-2.0
|
|
* \copyright Copyright (C) 2023 Lamdonn.
|
|
********************************************************************************************************/
|
|
#ifndef __queue_H
|
|
#define __queue_H
|
|
|
|
#include <stdlib.h>
|
|
|
|
/* version infomation */
|
|
|
|
#define QUEUE_V_MAJOR 1
|
|
#define QUEUE_V_MINOR 0
|
|
#define QUEUE_V_PATCH 0
|
|
|
|
/* queue type definition, hiding structural members, not for external use */
|
|
|
|
typedef struct QUEUE *queue_t;
|
|
|
|
/**
|
|
* \brief create a queue.
|
|
* \param[in] dsize: size of queue data
|
|
* \param[in] capacity: capacity of queue
|
|
* \param[in] base: allocated array or pass in `NULL` to dynamically allocate space
|
|
* \return queue handler or NULL fail
|
|
*/
|
|
queue_t queue_create(int dsize, int capacity, void *base);
|
|
|
|
/**
|
|
* \brief delete a queue.
|
|
* \param[in] queue: queue handler
|
|
* \return none
|
|
*/
|
|
void queue_delete(queue_t queue);
|
|
|
|
/**
|
|
* \brief push data into the queue.
|
|
* \param[in] queue: address of queue
|
|
* \param[in] data: the address of data
|
|
* \return 1 success or 0 fail
|
|
*/
|
|
int queue_push(queue_t queue, void* data);
|
|
|
|
/**
|
|
* \brief pop data from the queue.
|
|
* \param[in] queue: address of queue
|
|
* \param[out] data: the address of data
|
|
* \return 1 success or 0 fail
|
|
*/
|
|
int queue_pop(queue_t queue, void* data);
|
|
|
|
/**
|
|
* \brief clear queue.
|
|
* \param[in] queue: address of queue
|
|
* \return none
|
|
*/
|
|
void queue_clear(queue_t queue);
|
|
|
|
/**
|
|
* \brief get queue index.
|
|
* \param[in] queue: address of queue
|
|
* \param[in] index: index of queue
|
|
* \return index of queue buffer or negative fail
|
|
*/
|
|
int queue_index(queue_t queue, int index);
|
|
|
|
/**
|
|
* \brief get data address of queue.
|
|
* \param[in] queue: queue handler
|
|
* \param[in] index: index
|
|
* \return address of queue data or NULL fail
|
|
*/
|
|
void* queue_data(queue_t queue, int index);
|
|
|
|
/**
|
|
* \brief get size of queue.
|
|
* \param[in] queue: queue handler
|
|
* \return size of queue
|
|
*/
|
|
int queue_size(queue_t queue);
|
|
|
|
/**
|
|
* \brief get capacity of queue.
|
|
* \param[in] queue: queue handler
|
|
* \return capacity of queue
|
|
*/
|
|
int queue_capacity(queue_t queue);
|
|
|
|
/**
|
|
* \brief get data size of queue.
|
|
* \param[in] queue: queue handler
|
|
* \return data size of queue
|
|
*/
|
|
int queue_dsize(queue_t queue);
|
|
|
|
/**
|
|
* \brief check if empty.
|
|
* \param[in] queue: queue handler
|
|
* \return 1 empty or 0 not empty
|
|
*/
|
|
int queue_empty(queue_t queue);
|
|
|
|
/**
|
|
* \brief check if full.
|
|
* \param[in] queue: queue handler
|
|
* \return 1 full or 0 not full
|
|
*/
|
|
int queue_full(queue_t queue);
|
|
|
|
/**
|
|
* \brief A simple method for `queue_create`.
|
|
* \param[in] type: data type
|
|
* \param[in] capacity: capacity of queue
|
|
* \return queue handler or NULL fail
|
|
*/
|
|
#define queue(type, capacity) queue_create(sizeof(type), (capacity), NULL)
|
|
|
|
/**
|
|
* \brief A simple method for `queue_delete`.
|
|
* \param[in] queue: queue handler
|
|
* \return none
|
|
*/
|
|
#define _queue(queue) do{queue_delete(queue);(queue)=NULL;}while(0)
|
|
|
|
/**
|
|
* \brief Random access method for queue data.
|
|
* \param[in] queue: queue handler
|
|
* \param[in] type: data type
|
|
* \param[in] i: index starting from queue header
|
|
* \return Reference to queue data
|
|
*/
|
|
#define queue_at(queue, type, i) (*(type *)queue_data((queue), (i)))
|
|
|
|
#endif
|