Protobuf-源码中值得学习的地方

本文深入探讨了Protobuf源码中的一些优秀实践,包括使用宏提高代码可读性,如CHARACTER_CLASS和PROTOBUF_DEFINE_ACCESSOR等;资源分配的lazy机制,如DescriptorPool的分层设计和GeneratedMessageFactory的延迟加载;内存复用策略,如RepeatedPtrFieldBase如何实现message的clear与复用;以及封装多种类型和模版参数的处理方式。通过对这些设计的学习,可以提升代码质量和效率。
摘要由CSDN通过智能技术生成

使用宏来提高代码可读性(代码的美感)

例1.宏CHARACTER_CLASS

定义

tokenizer.cc文件中,需要判断某个character是属于哪种类型的字符,通过宏CHARACTER_CLASS来定义字符类型,并且定义static类型的InClass()接口来判断。

    #define CHARACTER_CLASS(NAME, EXPRESSION)      \
      class NAME {                                 \
       public:                                     \
        static inline bool InClass(char c) {       \
          return EXPRESSION;                       \
        }                                          \
      }

    CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' ||
                                c == '\r' || c == '\v' || c == '\f');

    CHARACTER_CLASS(Unprintable, c < ' ' && c > '\0');

    CHARACTER_CLASS(Digit, '0' <= c && c <= '9');
    CHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7');
    CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') ||
                              ('a' <= c && c <= 'f') ||
                              ('A' <= c && c <= 'F'));

    CHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') ||
                            ('A' <= c && c <= 'Z') ||
                            (c == '_'));

    CHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') ||
                                  ('A' <= c && c <= 'Z') ||
                                  ('0' <= c && c <= '9') ||
                                  (c == '_'));

    CHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' ||
                            c == 'r' || c == 't' || c == 'v' || c == '\\' ||
                            c == '?' || c == '\'' || c == '\"');

    #undef CH
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值