美文网首页
leveldb源码-util之logging

leveldb源码-util之logging

作者: peteyuan | 来源:发表于2016-10-20 16:18 被阅读51次

    这不是一个日志工具类... 只定义了几个全局函数:

    字符串后追加数字

    // 比较简单,就是snprintf把字符串转一下,然后append
    void AppendNumberTo(std::string* str, uint64_t num) {
      char buf[30];
      snprintf(buf, sizeof(buf), "%llu", (unsigned long long) num);
      str->append(buf);
    }
    

    字符串追加字符数组

    // 正常字符直接追加,需要转义的字符先处理一下,处理方式值得学习
    void AppendEscapedStringTo(std::string* str, const Slice& value) {
      for (size_t i = 0; i < value.size(); i++) {
        char c = value[i];
        if (c >= ' ' && c <= '~') {
          str->push_back(c);
        } else {
          char buf[10];
          snprintf(buf, sizeof(buf), "\\x%02x",
                   static_cast<unsigned int>(c) & 0xff);
          str->append(buf);
        }
      }
    }
    

    整型转字符串: 先创建一个空字符串,然后调用字符串追加整数的方法
    字符串转义:先创建空字符串,然后追加字符

    把一个表示整数的字符数组转成整数:

    // C++版的atoi,值得学习
    // 1. 考虑了最大整数溢出的问题
    // 2. 考虑了第一个字符是否数字的问题
    // 3. 看起来只能转正整数
    bool ConsumeDecimalNumber(Slice* in, uint64_t* val) {
      uint64_t v = 0;
      int digits = 0;
      while (!in->empty()) {
        char c = (*in)[0];
        if (c >= '0' && c <= '9') {
          ++digits;
          const int delta = (c - '0');
          static const uint64_t kMaxUint64 = ~static_cast<uint64_t>(0);
          if (v > kMaxUint64/10 ||
              (v == kMaxUint64/10 && delta > kMaxUint64%10)) {
            // Overflow
            return false;
          }
          v = (v * 10) + delta;
          in->remove_prefix(1);
        } else {
          break;
        }
      }
      *val = v;
      return (digits > 0);
    }
    

    相关文章

      网友评论

          本文标题:leveldb源码-util之logging

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