9.2. 参数表 Args

9.2.1. 头文件

#include "dataArgs.h"

9.2.2. 概述

  1. Args参数表API是以 args_ 为前缀的一系列函数。

  2. Args参数表API是使用面向对象的思想设计的,这些函数的第一个入口参数都是被操作参数表的指针。

  3. Args参数表使用键值对(Map)数据模型,或称为字典(Dist)

  4. 一个参数表内可以包含任意个参数,每个参数使用**参数名(键)**索引。

  5. 索引得到的参数可以是基本数据类型(int, float, pointer, string)或者泛型参数(Arg)。

  6. Args参数表支持动态增加、删除、修改、查找参数。

  7. Args参数表不支持嵌套(和PikaObj属性的主要区别)。

9.2.3. 数据类型

参数表的数据类型是Args。

typedef Link Args;

参数表内部基于链表(Link)实现。 注意不要直接访问Args内部的链表,请使用Args API访问Args。以获得最大的向后兼容性

9.2.4. 参数表的新建和销毁

  1. 新建参数表,从堆中新建一个参数表,返回参数表的指针。注意新建的参数表需要手动销毁来回收内存。不断新建参数表但不销毁会导致内存泄漏。

[注意] 为避免内存泄漏,请在 docker 开发环境 下进行开发,确保充足的单元测试和内存检查。

Args* New_args(Args* args);

新建参数表传入的参数是一个预留的辅助参数表,通常情况下填NULL即可。

  1. 销毁参数表。当一个参数表被销毁时,参数表内部的所有参数也会被自动销毁

void args_deinit(Args* self);

传入参数表的指针,销毁参数表。

9.2.5. 增删改查API

这一部分API提供了对参数表的增删改查。

9.2.5.1. 基本类型的增删改查

Args参数表支持整形、浮点型、指针、字串四种基本类型的参数。使用set和get方法即可读写一个参数表内的参数。

Args参数表是动态的,因此可以随时为参数表新增新的参数。

基本类型属性的API有如下这些,和对象的参数API相似,但不支持嵌套

/* set API */
int32_t args_setInt(Args* self, char* name, int64_t int64In);
int32_t args_setFloat(Args* self, char* name, float argFloat);
int32_t args_setPtr(Args* self, char* name, void* argPointer);
int32_t args_setStr(Args* self, char* name, char* strIn);

/* get API */
int64_t args_getInt(Args* self, char* name);
float args_getFloat(Args* self, char* name);
void* args_getPtr(Args* self, char* name);
char* args_getStr(Args* self, char* name);

基本类型属性的命名方式为args_set[Type]和args_get[Type]。

  1. 第一个输入参数为要操作的参数表指针。

  2. 第二个输入参数为参数名

  3. set方法的第三个输入参数为写入的参数值,get方法的返回值为读取的参数值。

  4. set方法的返回值为错误码,为0表示无错误发生。

9.2.5.2. 泛型参数

args支持泛型参数,同样提供set方法和get方法。输入参数和返回值与基本类型相似。 args_getType可以获得参数的类型。

int32_t args_setArg(Args* self, Arg* arg);
Arg* args_getArg(Args* self, char* name);
ArgType args_getType(Args* self, char* name);

泛型参数在使用时需要转换为基本类型。

使用以下API可以判断泛型参数的当前类型。

ArgType arg_getType(Arg* self);

使用以下的API可以将泛型参数转换为基本类型。

int64_t arg_getInt(Arg* self);
float arg_getFloat(Arg* self);
void* arg_getPtr(Arg* self);
char* arg_getStr(Arg* self);

9.2.5.3. 参数管理

  1. 使用参数名哈希或者参数名判断一个参数是否存在,返回值为1表示存在,使用times33算法获得参数名哈希。

int32_t args_isArgExist_hash(Args* self, Hash nameHash);
int32_t args_isArgExist(Args* self, char* name);
Hash hash_time33(char* str);
  1. 使用泛型参数的指针删除一个参数

int32_t args_removeArg(Args* self, Arg* argNow);

返回值为错误码,为0表示成功。

9.2.6. 参数表的遍历

可以使用下面的API遍历一个参数表。

  1. 第一个入口参数是参数表的指针。

  2. 第二个参数是遍历参数时的回调函数的函数指针

  3. 第三个参数是辅助的参数表,用来传递辅助参数,在不使用辅助参数时,第三个输入参数可以填NULL。

int32_t args_foreach(Args* self,
                     int32_t (*eachHandle)(Arg* argEach, Args* handleArgs),
                     Args* handleArgs);