mirror of
https://gitee.com/Lamdonn/varch.git
synced 2025-12-06 08:46:42 +08:00
164 lines
4.1 KiB
C
164 lines
4.1 KiB
C
/*********************************************************************************************************
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* file description
|
|
* ------------------------------------------------------------------------------------------------------
|
|
* \file map.h
|
|
* \unit map
|
|
* \brief This is a general-purpose C language map module, with common data structure
|
|
* \author Lamdonn
|
|
* \version v1.0.1
|
|
* \license GPL-2.0
|
|
* \copyright Copyright (C) 2023 Lamdonn.
|
|
********************************************************************************************************/
|
|
#ifndef __map_H
|
|
#define __map_H
|
|
|
|
#include "map_cfg.h"
|
|
#include <stdlib.h>
|
|
|
|
/* version infomation */
|
|
|
|
#define MAP_V_MAJOR 1
|
|
#define MAP_V_MINOR 0
|
|
#define MAP_V_PATCH 1
|
|
|
|
/* map type definition, hiding structural members, not for external use */
|
|
|
|
typedef struct MAP *map_t;
|
|
|
|
/**
|
|
* \brief create map
|
|
* \param[in] vsize: size of map data
|
|
* \return map handler or NULL: fail
|
|
*/
|
|
map_t map_create(int vsize, int ksize, void *trans);
|
|
|
|
/**
|
|
* \brief delete map
|
|
* \param[in] map: map handler
|
|
* \return none
|
|
*/
|
|
void map_delete(map_t map);
|
|
|
|
/**
|
|
* \brief insert data to map.
|
|
* \param[in] map: map handler
|
|
* \param[in] value value, address of value
|
|
* \param[in] ...: mpair(key, value), key and address of value
|
|
* \return address of map data or NULL fail
|
|
*/
|
|
void* map_insert(map_t map, ...);
|
|
|
|
/**
|
|
* \brief erase data from map.
|
|
* \param[in] map: map handler
|
|
* \param[in] ...: key
|
|
* \return 1 success or 0 fail
|
|
*/
|
|
int map_erase(map_t map, ...);
|
|
|
|
/**
|
|
* \brief find index from map
|
|
* \param[in] map: map handler
|
|
* \param[in] ...: key
|
|
* \return 1 success or 0 fail
|
|
*/
|
|
int map_find(map_t map, ...);
|
|
|
|
/**
|
|
* \brief get the address of item data from map
|
|
* \param[in] map: map handler
|
|
* \param[in] ...: key
|
|
* \return address of map data or map_error(): fail
|
|
*/
|
|
void* map_data(map_t map, ...);
|
|
|
|
/**
|
|
* \brief clear all nodes under the map
|
|
* \param[in] map: map handler
|
|
* \return none
|
|
*/
|
|
void map_clear(map_t map);
|
|
|
|
/**
|
|
* \brief get the size of map
|
|
* \param[in] map: map handler
|
|
* \return size of map
|
|
*/
|
|
int map_size(map_t map);
|
|
|
|
/**
|
|
* \brief get the size of map key
|
|
* \param[in] map: map handler
|
|
* \return size of map key
|
|
*/
|
|
int map_ksize(map_t map);
|
|
|
|
/**
|
|
* \brief get the size of map value
|
|
* \param[in] map: map handler
|
|
* \return size of map value
|
|
*/
|
|
int map_vsize(map_t map);
|
|
|
|
/**
|
|
* \brief error return value
|
|
* \param[in] map: map handler
|
|
* \return error pointer
|
|
*/
|
|
void* map_error(map_t map);
|
|
|
|
/**
|
|
* \brief iterate init at tail
|
|
* \param[in] map: map handler
|
|
* \param[in] orgin: MAP_HEAD or MAP_TAIL
|
|
* \return none
|
|
*/
|
|
void map_it_init(map_t map, int orgin);
|
|
|
|
/**
|
|
* \brief iterate get
|
|
* \param[in] map: map handler
|
|
* \param[out] kaddress: address of key
|
|
* \param[out] ksize: size of key
|
|
* \return address of map iterator data
|
|
*/
|
|
void* map_it_get(map_t map, void **kaddress, int *ksize);
|
|
|
|
/**
|
|
* \brief A simple method for `map_create`
|
|
* \param[in] ktype: key type, default support: char, int, string, float, double
|
|
* \param[in] vtype: value type
|
|
* \return map handler or NULL: fail
|
|
*/
|
|
#define map(ktype, vtype) map_create(sizeof(vtype), (MK_TYPE(ktype)==MAP_KEY_TYPE_POINTER)?0:sizeof(ktype), MK_TRANS(ktype))
|
|
|
|
/**
|
|
* \brief A simple method for `map_delete`.
|
|
* \param[in] map: map handler
|
|
* \return none
|
|
*/
|
|
#define _map(map) do{map_delete(map);(map)=0;}while(0)
|
|
|
|
/**
|
|
* \brief Random access method for map data.
|
|
* \param[in] map: map handler
|
|
* \param[in] type: value type
|
|
* \param[in] key: key
|
|
* \return Reference to map data
|
|
*/
|
|
#define map_at(map, type, key) (*(type *)map_data((map), (key)))
|
|
|
|
/**
|
|
* \brief Key value pairs.
|
|
* \param[in] key: key
|
|
* \param[in] value: address of value
|
|
* \return pair
|
|
*/
|
|
#define mpair(key, value) (value),(key)
|
|
|
|
#define MAP_HEAD 0
|
|
#define MAP_TAIL 1
|
|
|
|
#endif
|