美文网首页
tbox中tb_for的使用

tbox中tb_for的使用

作者: czs_0_0_0_0 | 来源:发表于2019-08-23 21:54 被阅读0次

在接触tbox这个开源库的时候,见识到了一个非常神奇的宏用来实现C语言的for-each循环,不禁让我很佩服作者的设计思路,想拿出来分享一下。

// 输入一共五个参数,type为元素类型,item为遍历取出的元素,head为容器的索引头,tail为容器的索引尾,iterator为自定义的迭代器
#define tb_for(type, item, head, tail, iterator) \
            /* iterator */ \
            // 先是用断言检查迭代器异常
            tb_iterator_ref_t item##_iterator = (tb_iterator_ref_t)iterator; \
            tb_assert(!item##_iterator || (tb_iterator_mode(item##_iterator) & (TB_ITERATOR_MODE_FORWARD | TB_ITERATOR_MODE_RACCESS))); \
            /* init */ \
            // 这里进行初始化操作
            type item; \
            tb_size_t item##_itor = head; \
            tb_size_t item##_head = head; \
            tb_size_t item##_tail = tail; \
            /* walk */ \
            // 开始遍历前先确认容器是否可以遍历,可以的话进入for循环
            if (item##_iterator && item##_head != item##_tail) \
                for (   ; \
                        // 如果没到最后一个元素则返回真继续遍历并且赋值给item贡开发者使用
                        // 为了防止这个元素值为0后面又加了个1保证&&后面的条件一定为真
                        item##_itor != item##_tail && ((item = (type)tb_iterator_item(item##_iterator, item##_itor)), 1); \
                        // 迭代器指向下一个元素
                        item##_itor = tb_iterator_next(item##_iterator, item##_itor))

上面的宏需要指定头部索引与尾部索引,那么可以简化一下写成如下形式只需提供迭代器即可遍历:

#define tb_for_all(type, item, iterator) \
            tb_iterator_ref_t item##_iterator_all = (tb_iterator_ref_t)iterator; \
            tb_for(type, item, tb_iterator_head(item##_iterator_all), tb_iterator_tail(item##_iterator_all), item##_iterator_all)

具体使用的时候,以tbox的hashmap为例:

tb_for_all(tb_hash_map_item_ref_t, item, iterator)
{
     if (item) tb_trace_d("item: %p => %p", item->name, item->data);
}

大括号中拿到的item就是hashmap中的键值对,使用起来就像内置的关键字一样方便。
进一步扩展还可以增加一个条件判断:

#define tb_for_if(type, item, head, tail, iterator, cond) \
            /* iterator */ \
            tb_iterator_ref_t item##_iterator = (tb_iterator_ref_t)iterator; \
            tb_assert(!item##_iterator || (tb_iterator_mode(item##_iterator) & (TB_ITERATOR_MODE_FORWARD | TB_ITERATOR_MODE_RACCESS))); \
            /* init */ \
            type item; \
            tb_size_t item##_itor = head; \
            tb_size_t item##_head = head; \
            tb_size_t item##_tail = tail; \
            /* walk */ \
            if (item##_iterator && item##_head != item##_tail) \
                for (   ; \
                        item##_itor != item##_tail && ((item = (type)tb_iterator_item(item##_iterator, item##_itor)), 1); \
                        item##_itor = tb_iterator_next(item##_iterator, item##_itor)) if ((cond))

tbox的github链接如下:
https://github.com/tboox/tbox

相关文章

  • tbox中tb_for的使用

    在接触tbox这个开源库的时候,见识到了一个非常神奇的宏用来实现C语言的for-each循环,不禁让我很佩服作者的...

  • am start 启动activity 命令

    使用am start命令启动android apk应用程序 启动tbox service test apkadb ...

  • 车联网Tbox电源模式管理

    Tbox电源模式 当 Tbox 进行电源模式切换时应该通知 CSP。在车辆熄火(ignition off)后 Tb...

  • tbox协程使用之切换与等待

    tbox的协程实现,是stackfull模式的,需要指定独立堆栈和协程函数,目前暂时还不能像golang那样实现堆...

  • 智能驾驶系列-Tbox

    Telematics BOX,简称车载T-BOX,汽车上的电子元器件和网络单元越来越多,汽车从一个单独封闭的整体变...

  • 自制tbox大致思路

    选用STM32F4的芯片,使用恩智浦的can收发器,使用移远的通信模组 编写调试can驱动,移动4G模组的驱动,S...

  • 针对汽车ECU的OTA策略实现的必要条件

    针对刷新TBOX,需要的条件:bootloader。支持解析HEX或者bin。 针对刷新其他ECU,需要的条件:控...

  • 记boost协程切换bug发现和分析

    在分析了各大开源协程库实现后,最终选择参考boost.context的汇编实现,来写tbox的切换内核。 在这过程...

  • tbox新增stackless协程支持

    tbox之前提供的stackfull协程库,虽然切换效率已经非常高了,但是由于每个协程都需要维护一个独立的堆栈,内...

  • 协程分析之context上下文切换

    协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持。 最近为了要给tbox增加...

网友评论

      本文标题:tbox中tb_for的使用

      本文链接:https://www.haomeiwen.com/subject/nncxectx.html