Coverage Report

Created: 2025-11-11 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/leveldb/util/coding.cc
Line
Count
Source
1
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5
#include "util/coding.h"
6
7
namespace leveldb {
8
9
747k
void PutFixed32(std::string* dst, uint32_t value) {
10
747k
  char buf[sizeof(value)];
11
747k
  EncodeFixed32(buf, value);
12
747k
  dst->append(buf, sizeof(buf));
13
747k
}
14
15
395k
void PutFixed64(std::string* dst, uint64_t value) {
16
395k
  char buf[sizeof(value)];
17
395k
  EncodeFixed64(buf, value);
18
395k
  dst->append(buf, sizeof(buf));
19
395k
}
20
21
19.3M
char* EncodeVarint32(char* dst, uint32_t v) {
22
  // Operate on characters as unsigneds
23
19.3M
  uint8_t* ptr = reinterpret_cast<uint8_t*>(dst);
24
19.3M
  static const int B = 128;
25
19.3M
  if (v < (1 << 7)) {
26
18.8M
    *(ptr++) = v;
27
18.8M
  } else if (v < (1 << 14)) {
28
531k
    *(ptr++) = v | B;
29
531k
    *(ptr++) = v >> 7;
30
531k
  } else if (v < (1 << 21)) {
31
13.9k
    *(ptr++) = v | B;
32
13.9k
    *(ptr++) = (v >> 7) | B;
33
13.9k
    *(ptr++) = v >> 14;
34
18.4E
  } else if (v < (1 << 28)) {
35
0
    *(ptr++) = v | B;
36
0
    *(ptr++) = (v >> 7) | B;
37
0
    *(ptr++) = (v >> 14) | B;
38
0
    *(ptr++) = v >> 21;
39
18.4E
  } else {
40
18.4E
    *(ptr++) = v | B;
41
18.4E
    *(ptr++) = (v >> 7) | B;
42
18.4E
    *(ptr++) = (v >> 14) | B;
43
18.4E
    *(ptr++) = (v >> 21) | B;
44
18.4E
    *(ptr++) = v >> 28;
45
18.4E
  }
46
19.3M
  return reinterpret_cast<char*>(ptr);
47
19.3M
}
48
49
12.5M
void PutVarint32(std::string* dst, uint32_t v) {
50
12.5M
  char buf[5];
51
12.5M
  char* ptr = EncodeVarint32(buf, v);
52
12.5M
  dst->append(buf, ptr - buf);
53
12.5M
}
54
55
2.94M
char* EncodeVarint64(char* dst, uint64_t v) {
56
2.94M
  static const int B = 128;
57
2.94M
  uint8_t* ptr = reinterpret_cast<uint8_t*>(dst);
58
4.07M
  while (v >= B) {
59
1.13M
    *(ptr++) = v | B;
60
1.13M
    v >>= 7;
61
1.13M
  }
62
2.94M
  *(ptr++) = static_cast<uint8_t>(v);
63
2.94M
  return reinterpret_cast<char*>(ptr);
64
2.94M
}
65
66
2.94M
void PutVarint64(std::string* dst, uint64_t v) {
67
2.94M
  char buf[10];
68
2.94M
  char* ptr = EncodeVarint64(buf, v);
69
2.94M
  dst->append(buf, ptr - buf);
70
2.94M
}
71
72
3.93M
void PutLengthPrefixedSlice(std::string* dst, const Slice& value) {
73
3.93M
  PutVarint32(dst, value.size());
74
3.93M
  dst->append(value.data(), value.size());
75
3.93M
}
76
77
6.75M
int VarintLength(uint64_t v) {
78
6.75M
  int len = 1;
79
6.79M
  while (v >= 128) {
80
41.2k
    v >>= 7;
81
41.2k
    len++;
82
41.2k
  }
83
6.75M
  return len;
84
6.75M
}
85
86
const char* GetVarint32PtrFallback(const char* p, const char* limit,
87
1.44M
                                   uint32_t* value) {
88
1.44M
  uint32_t result = 0;
89
2.64M
  for (uint32_t shift = 0; shift <= 28 && p < limit; shift += 7) {
90
2.36M
    uint32_t byte = *(reinterpret_cast<const uint8_t*>(p));
91
2.36M
    p++;
92
2.36M
    if (byte & 128) {
93
      // More bytes are present
94
1.19M
      result |= ((byte & 127) << shift);
95
1.19M
    } else {
96
1.16M
      result |= (byte << shift);
97
1.16M
      *value = result;
98
1.16M
      return reinterpret_cast<const char*>(p);
99
1.16M
    }
100
2.36M
  }
101
278k
  return nullptr;
102
1.44M
}
103
104
8.41M
bool GetVarint32(Slice* input, uint32_t* value) {
105
8.41M
  const char* p = input->data();
106
8.41M
  const char* limit = p + input->size();
107
8.41M
  const char* q = GetVarint32Ptr(p, limit, value);
108
8.41M
  if (q == nullptr) {
109
278k
    return false;
110
8.13M
  } else {
111
8.13M
    *input = Slice(q, limit - q);
112
8.13M
    return true;
113
8.13M
  }
114
8.41M
}
115
116
5.91M
const char* GetVarint64Ptr(const char* p, const char* limit, uint64_t* value) {
117
5.91M
  uint64_t result = 0;
118
7.46M
  for (uint32_t shift = 0; shift <= 63 && p < limit; shift += 7) {
119
7.46M
    uint64_t byte = *(reinterpret_cast<const uint8_t*>(p));
120
7.46M
    p++;
121
7.46M
    if (byte & 128) {
122
      // More bytes are present
123
1.54M
      result |= ((byte & 127) << shift);
124
5.91M
    } else {
125
5.91M
      result |= (byte << shift);
126
5.91M
      *value = result;
127
5.91M
      return reinterpret_cast<const char*>(p);
128
5.91M
    }
129
7.46M
  }
130
152
  return nullptr;
131
5.91M
}
132
133
5.91M
bool GetVarint64(Slice* input, uint64_t* value) {
134
5.91M
  const char* p = input->data();
135
5.91M
  const char* limit = p + input->size();
136
5.91M
  const char* q = GetVarint64Ptr(p, limit, value);
137
5.91M
  if (q == nullptr) {
138
0
    return false;
139
5.91M
  } else {
140
5.91M
    *input = Slice(q, limit - q);
141
5.91M
    return true;
142
5.91M
  }
143
5.91M
}
144
145
5.33M
bool GetLengthPrefixedSlice(Slice* input, Slice* result) {
146
5.33M
  uint32_t len;
147
5.33M
  if (GetVarint32(input, &len) && input->size() >= len) {
148
5.33M
    *result = Slice(input->data(), len);
149
5.33M
    input->remove_prefix(len);
150
5.33M
    return true;
151
5.33M
  } else {
152
0
    return false;
153
0
  }
154
5.33M
}
155
156
}  // namespace leveldb