Efficient serialization in C tpl

本文主要介绍了C语言模板库tpl的数组表示,包括固定长度数组和变长数组的使用,以及pack和unpack的区别。固定数组通过i#、c#等形式表示,一次性pack和unpack;变长数组如A(i)则需要逐个元素处理。同时,文章提到了tpl_Alen函数在解包前获取变长数组长度的应用,并提供了多个测试函数以区分各种数组操作。
摘要由CSDN通过智能技术生成

tpl 主页
tpl 文档
tpl github

主要是对 tpl文档 中的数组表示进行说明以及代码测试
关于文档后面的 peek jot hook gather 内容 我也没有详细阅读 代码里也就没有相关测试了

数组主要分为两种 固定数组 fixed-length-array 以及 变长数组 variable-length-array

  • 固定数组表示为 i# 或者 c# 等等
  • 变长数组表示为 A(i) 或者 A© 等等 (关于字符串类型s的使用不在这里描述)

关于这两种不同表示的pack和unpack是不一样的

  • 固定数组是一次pack完毕的 tpl_pack(tn, 0) unpack也是一次解压
  • 变长数组是一次pack一个数据 tpl_pack(tn, 1) unpack也是多次解压

关于上面pack时的参数 0 和 1 的 index 说明 (是我自己看完文档之后自己的解释)

  • 当使用了类型A时 这个参数时index才有意义 没有A类型时 全部都是一次压缩和解压都使用 index 0
  • 有类型 A 存在时 index 仅仅按照顺序表示每一个 A 中的元素 与是否嵌套或者其他关系无法 只和顺序有关
    若在 A(…) 之外存在其他类型字段时那么 0 表示其他非 A(…) 的全部字段
  • A(A(i)) index 1 表示第一个A index 2 表示第二个 A 在 pack 时需要根据嵌套关系先压 index2 的数据 在压 index1 的数据
    testVariableLengthArrayPack2 函数是对 类型 A(A(i)) 的测试
  • icA(A(i))i 此时除了 index 1 和 2 以外 还需要压一次 index 为 0 的数据 将开头的 ic 和 末尾的 i 数据进行压入

使用 tpl_Alen 函数可以在 unpack 之前得到变长数组的长度 在 testVariableLengthArrayUnpackChar2 中可以看到这个函数的用法

关于以上数组的说明请自行阅读一下几个函数弄清楚区别
testFixedLengthArrayPackChar
testFixedLengthArrayUnpackChar
testVariableLengthArrayPackChar
testVariableLengthArrayUnpackChar

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include "../extra/tpl.h"

int storing(int argc, char *argv[])
{
   
    tpl_node *tn;
    int id = 0;
    char *name, *names[] = {
   "joe", "bob", "cary"};

    tn = tpl_map("A(is)", &id, &name);

    for (name = names[0]; id < 3; name = names[++id])
    {
   
        tpl_pack(tn, 1);
    }

    tpl_dump(tn, TPL_FILE, "users.tpl");
    tpl_free(tn);
}

int reloading(int argc, char *argv[])
{
   
    tpl_node *tn;
    int id;
    char *name;

    tn = tpl_map("A(is)", &id, &name);
    tpl_load(tn, TPL_FILE, "users.tpl");

    while (tpl_unpack(tn, 1) > 0)
    {
   
        printf("id %d, user %s\n", id, name);
        free(name);
    }
    tpl_free(tn);
}

// --------------------------------------------------------------------
// 数字数组
int testFixedLengthArrayPack(int argc, char *argv[])
{
   
    tpl_node *tn;
    int x[] = {
   0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    tn = tpl_map("i#", x, 10);
    tpl_pack(tn, 0); /* pack all 10 elements at once */
    tpl_dump(tn, TPL_FILE, "fixed.tpl");
    tpl_free(tn);
}

int testVariableLengthArrayPack(int argc, char *argv[])
{
   
    tpl_node *tn;
    int x;

    tn = tpl_map("A(i)", &x);
    for (x = 0; x < 10; x++)
    {
   
        tpl_pack(tn, 1); /* pack one element at a time */
    }
    tpl_dump(tn, TPL_FILE, "variable.tpl");
    tpl_free(tn);
}

int testFixedLengthArrayUnpack(int argc, char *argv[])
{
   
    tpl_node *tn;
    int x[10];

    tn = tpl_map("i#", x, 10);
    tpl_load(tn, TPL_FILE, "fixed.tpl");
    tpl_unpack(tn, 0); /* unpack all 10 elements at once */
    tpl_free(tn);
    for (int i = 0; i < 10; ++i)
    {
   
        printf("%d ", x[i]); /* unpack one by one */
    }
    printf("\n");
    /* now do something with x[0]...x[9].. (not shown) */
}

int testVariableLengthArrayUnpack(int argc, char *argv[])
{
   
    tpl_node *tn;
    int x;

    tn = tpl_map("A(i)", &x);
    tpl_load(tn, TPL_FILE, "variable.tpl");
    while (tpl_unpack(tn, 1) > 0)
    {
   
        printf("%d ", x); /* unpack one by one */
    }
    printf("\n");
    tpl_free(tn);
}

// --------------------------------------------------------------------
// 字符数组 字符串
int testFixedLengthArrayPackChar(int argc, char *argv[])
{
   
    tpl_node *tn;
    char x[] = {
   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};

    tn = tpl_map("c#", x, 10);
    tpl_pack(tn
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值