/**
* @file cstl_public.h
* @copyright Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* @brief cstl_public 公共模块对外定义
* @details cstl公共定义实现源码
* @date 2021-05-14
* @version v0.1.0
* *******************************************************************************************
* @par 修改日志:
*
* | Date | Version | Description
* |
|---|
| 2021-05-14 | 0.1.0 | 创建初始版本
* |
* *******************************************************************************************
*/
#ifndef CSTL_PUBLIC_H
#define CSTL_PUBLIC_H
#include
#include
#include
#ifdef __cplusplus
extern "C" {
#endif /* __cpluscplus */
/* ******************************************************************************** */
/* 公共错误码定义 */
/* ******************************************************************************** */
enum {
ERRNO_ELEMENT_EMPTY = 1,
ERRNO_INPUT_INVALID = 2,
ERRNO_NODE_CREATE_FAIL = 3,
};
/**
* @ingroup cstl_public
* 0x0 正确。
*/
#define CSTL_OK 0
/**
* @ingroup cstl_public
* -1 错误。
*/
#define CSTL_ERROR (-1)
/**
* @ingroup cstl_public
* CSTL_ERRNO_BASE 错误码定义
*/
#define CSTL_ERRNO_BASE (uint32_t)0x0a03u
/**
* @ingroup cstl_public
* 容器不是NULL但是内容为空,该值为十六进制的0xa030001
*/
#define ERRNO_CSTL_ELEMENT_EMPTY ((CSTL_ERRNO_BASE << 16u) | ((uint32_t)ERRNO_ELEMENT_EMPTY))
/**
* @ingroup cstl_public
* 容器的入参是非法的,该值为十六进制的0xa030002
*/
#define ERRNO_CSTL_INPUT_INVALID ((CSTL_ERRNO_BASE << 16u) | ((uint32_t)ERRNO_INPUT_INVALID))
/**
* @ingroup cstl_public
* 节点创建失败,该值为十六进制的0xa030003
*/
#define ERRNO_CSTL_NODE_CREATE_FAIL ((CSTL_ERRNO_BASE << 16u) | ((uint32_t)ERRNO_NODE_CREATE_FAIL))
/**
* @ingroup cstl_public
* @brief 比较函数原型
* @par 描述:比较函数原型,用于排序场景。
* @attention 注意:这里只定义了比较函数原型,由于不知道数据类型和长度,因此钩子函数需要业务自己实现。
* @param data1 [IN] 数据1
* @param data2 [IN] 数据2
* @retval >0 升序排序
* @retval =0 不做交换
* @retval <0 降序排序
*/
typedef int32_t (*CstlDataCmpFunc)(const void *data1, const void *data2);
/**
* @ingroup cstl_public
* @brief 比较函数原型
* @par 描述:比较函数原型,用于排序场景。
* @attention 注意:这里只定义了比较函数原型,由于不知道数据类型和长度,因此钩子函数需要业务自己实现。\n
* 当前源码内有默认的比较函数:该函数不对外提供,但是用户如果不指定默认比较方法会调用它,对此简单解释:
* 其比较方式为把当前数据转化为有符号数进行比较,即处理含有负数的场景,比较方式为升序。
* 如果用户需要存储的数据是无符号整数类型。此时排序结果可能不是预期的。
* 这种场景下的数据比较,用户需要自定义比较函数来解决这种情况的数据比较。
* 例如对于大数A = uintptr_t(-1) 和 大数 B = 1ULL << 50,目前的函数会认为A < B,实际上A是大于B的。
* 综上所述,用户对于使用什么样的比较函数,应该根据自己的数据类型来编写(包括降序或其它比较规则)
* @param key1 [IN] key1
* @param key2 [IN] key2
* @retval >0 升序排序
* @retval =0 不做交换
* @retval <0 降序排序
*/
typedef int32_t (*CstlKeyCmpFunc)(uintptr_t key1, uintptr_t key2);
/**
* @ingroup cstl_public
* @brief 匹配函数原型
* @par 描述:用于匹配查询场景。
* @attention 注意:这里只定义了函数原型,由于不知道用户查询匹配机制,因此钩子函数需要业务自己实现。
* @param node [IN] 算法结构体节点
* @param data [IN] 关键信息
* @retval true 匹配成功
* @retval false 匹配失败
*/
typedef bool (*CstlMatchFunc)(const void *node, uintptr_t data);
/**
* @ingroup cstl_public
* @brief 用户数据拷贝函数原型
* @attention 注意:源缓冲区长度需要调用者获取,由于不知道数据类型和长度,因此钩子函数需要业务自己实现。
* @param ptr [IN] 指向用户数据的指针
* @param size [IN] 用户数据拷贝长度
* @retval 目标缓冲区,NULL表示失败。
*/
typedef void *(*CstlDupFunc)(void *ptr, size_t size);
/**
* @ingroup cstl_public
* @brief 用户内存释放函数原型
* @par 描述:资源释放函数原型,一般用于机制批量free内存时,内存中可能含有用户私有资源,这是需要用户自行释放
* @param ptr [IN] 指向用户数据的指针
* @retval 无
*/
typedef void (*CstlFreeFunc)(void *ptr);
/**
* @ingroup cstl_public
* @brief 用户内存申请函数原型
* @attention 注意:用户内存申请函数原型,需要用户自己实现。
* @param size [IN] 内存申请大小
* @retval 指向分配内存空间的指针,NULL表示失败
*/
typedef void *(*CstlMallocFunc)(size_t size);
/**
* @ingroup cstl_public
* @brief 用户内存申请释放函数对
* @par 描述:内存申请和释放函数成对出现。
*/
typedef struct {
CstlMallocFunc mallocFunc;
CstlFreeFunc freeFunc;
} CstlMallocFreeFuncPair;
/**
* @ingroup cstl_public
* @brief key和value函数原型对
* @par 描述:key和value的拷贝及释放函数成对出现。
*/
typedef struct {
CstlDupFunc dupFunc;
CstlFreeFunc freeFunc;
} CstlDupFreeFuncPair;
/**
* @ingroup cstl_public
* @brief 该API通过结构的某个成员变量,得到这个结构的起始地址。
* @par 描述:
* 该API通过结构的某个成员变量,得到这个结构的起始地址。该API是一个特殊的宏,输入参数取决于宏的实现。
* @attention
* @param ptr [IN] 该参数表示结点某成员的地址。取值范围为数据类型。
* @param type [IN] 该参数表示传入的成员所属的结点类型结构。取值范围为数据类型。
* @param member [IN] 该参数表示结构中成员变量的名字。取值范围为数据类型。
* @retval 与入参类型相同结构的地址。
* @see 无。
*/
#define CSTL_CONTAINER_OF(ptr, type, member) \
((type *)((uintptr_t)(ptr) - (uintptr_t)(&(((type *)0)->member))))
#ifdef __cplusplus
}
#endif /* __cpluscplus */
#endif /* CSTL_PUBLIC_H */