2024-04-22 00:09:51 +08:00

146 lines
3.6 KiB
C

/*********************************************************************************************************
* ------------------------------------------------------------------------------------------------------
* file description
* ------------------------------------------------------------------------------------------------------
* \file set.h
* \unit set
* \brief This is a general-purpose C language set module, with common data structure
* \author Lamdonn
* \version v1.0.0
* \license GPL-2.0
* \copyright Copyright (C) 2023 Lamdonn.
********************************************************************************************************/
#ifndef __set_H
#define __set_H
#include <stdlib.h>
/* version infomation */
#define SET_V_MAJOR 1
#define SET_V_MINOR 0
#define SET_V_PATCH 0
/* set type definition, hiding structural members, not for external use */
typedef struct SET *set_t;
/**
* \brief create set
* \param[in] dsize: size of set data
* \return set handler or NULL: fail
*/
set_t set_create(int dsize);
/**
* \brief delete set
* \param[in] set: set handler
* \return none
*/
void set_delete(set_t set);
/**
* \brief insert data to set.
* \param[in] set: set handler
* \param[in] index: index
* \param[in] data: address of data
* \return address of set data or NULL fail
*/
void* set_insert(set_t set, int index, void* data);
/**
* \brief erase data from set.
* \param[in] set: set handler
* \param[in] index: index
* \return 1 success or 0 fail
*/
int set_erase(set_t set, int index);
/**
* \brief clear all nodes under the set
* \param[in] set: set handler
* \return none
*/
void set_clear(set_t set);
/**
* \brief get the size of set
* \param[in] set: set handler
* \return size of set
*/
int set_size(set_t set);
/**
* \brief get the data size of set.
* \param[in] set: set handler
* \return data size of set
*/
int set_dsize(set_t set);
/**
* \brief find index from set
* \param[in] set: set handler
* \param[in] index: index
* \return 1 success or 0 fail
*/
int set_find(set_t set, int index);
/**
* \brief get the address of item data from set
* \param[in] set: set handler
* \param[in] index: index
* \return address of set data or set_error(): fail
*/
void* set_data(set_t set, int index);
/**
* \brief error return value
* \param[in] set: set handler
* \return error pointer
*/
void* set_error(set_t set);
/**
* \brief iterate init at tail
* \param[in] set: set handler
* \param[in] orgin: SET_HEAD or SET_TAIL
* \return none
*/
void set_it_init(set_t set, int orgin);
/**
* \brief iterate get
* \param[in] set: set handler
* \param[out] out_index: out index
* \return address of set iterator data
*/
void* set_it_get(set_t set, int *out_index);
/**
* \brief A simple method for `set_create`
* \param[in] type: data type
* \return set handler or NULL: fail
*/
#define set(type) set_create(sizeof(type))
/**
* \brief A simple method for `set_delete`.
* \param[in] set: set handler
* \return none
*/
#define _set(set) do{set_delete(set);(set)=NULL;}while(0)
/**
* \brief Random access method for set data.
* \param[in] set: set handler
* \param[in] type: data type
* \param[in] i: index starting from set header
* \return Reference to set data
*/
#define set_at(set, type, i) (*(type *)set_data((set), (i)))
#define SET_HEAD 0
#define SET_TAIL 1
#endif