Coverage Report

Created: 2025-09-10 09:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/be/src/util/coding.h
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
6
// Use of this source code is governed by a BSD-style license that can be
7
// found in the LICENSE file. See the AUTHORS file for names of contributors.
8
9
#pragma once
10
11
#include <bit>
12
13
#ifndef __APPLE__
14
#include <endian.h>
15
#endif
16
#include <stdint.h>
17
#include <string.h>
18
19
#include "olap/olap_common.h"
20
#include "util/slice.h"
21
#include "vec/common/endian.h"
22
23
namespace doris {
24
#include "common/compile_check_begin.h"
25
// TODO(zc): add encode big endian later when we need it
26
// use big endian when we have order requirement.
27
// little endian is more efficient when we use X86 CPU, so
28
// when we have no order needs, we prefer little endian encoding
29
inline void encode_fixed8(uint8_t* buf, uint8_t val) {
30
    *buf = val;
31
}
32
33
244k
inline void encode_fixed16_le(uint8_t* buf, uint16_t val) {
34
244k
    val = to_endian<std::endian::little>(val);
35
244k
    memcpy(buf, &val, sizeof(val));
36
244k
}
37
38
79.7M
inline void encode_fixed32_le(uint8_t* buf, uint32_t val) {
39
79.7M
    val = to_endian<std::endian::little>(val);
40
79.7M
    memcpy(buf, &val, sizeof(val));
41
79.7M
}
42
43
146k
inline void encode_fixed64_le(uint8_t* buf, uint64_t val) {
44
146k
    val = to_endian<std::endian::little>(val);
45
146k
    memcpy(buf, &val, sizeof(val));
46
146k
}
47
48
24.4k
inline void encode_fixed128_le(uint8_t* buf, uint128_t val) {
49
24.4k
    val = to_endian<std::endian::little>(val);
50
24.4k
    memcpy(buf, &val, sizeof(val));
51
24.4k
}
52
53
3.73M
inline uint8_t decode_fixed8(const uint8_t* buf) {
54
3.73M
    return *buf;
55
3.73M
}
56
57
292k
inline uint16_t decode_fixed16_le(const uint8_t* buf) {
58
292k
    uint16_t res;
59
292k
    memcpy(&res, buf, sizeof(res));
60
292k
    return to_endian<std::endian::little>(res);
61
292k
}
62
63
206M
inline uint32_t decode_fixed32_le(const uint8_t* buf) {
64
206M
    uint32_t res;
65
206M
    memcpy(&res, buf, sizeof(res));
66
206M
    return to_endian<std::endian::little>(res);
67
206M
}
68
69
2.35G
inline uint64_t decode_fixed64_le(const uint8_t* buf) {
70
2.35G
    uint64_t res;
71
2.35G
    memcpy(&res, buf, sizeof(res));
72
2.35G
    return to_endian<std::endian::little>(res);
73
2.35G
}
74
75
24.4k
inline uint128_t decode_fixed128_le(const uint8_t* buf) {
76
24.4k
    uint128_t res;
77
24.4k
    memcpy(&res, buf, sizeof(res));
78
24.4k
    return to_endian<std::endian::little>(res);
79
24.4k
}
80
81
template <typename T>
82
73.2M
void put_fixed32_le(T* dst, uint32_t val) {
83
73.2M
    uint8_t buf[sizeof(val)];
84
73.2M
    encode_fixed32_le(buf, val);
85
73.2M
    dst->append((char*)buf, sizeof(buf));
86
73.2M
}
_ZN5doris14put_fixed32_leINS_10faststringEEEvPT_j
Line
Count
Source
82
71.0M
void put_fixed32_le(T* dst, uint32_t val) {
83
71.0M
    uint8_t buf[sizeof(val)];
84
71.0M
    encode_fixed32_le(buf, val);
85
71.0M
    dst->append((char*)buf, sizeof(buf));
86
71.0M
}
_ZN5doris14put_fixed32_leINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvPT_j
Line
Count
Source
82
2.19M
void put_fixed32_le(T* dst, uint32_t val) {
83
2.19M
    uint8_t buf[sizeof(val)];
84
2.19M
    encode_fixed32_le(buf, val);
85
2.19M
    dst->append((char*)buf, sizeof(buf));
86
2.19M
}
87
88
template <typename T>
89
26.3k
void put_fixed64_le(T* dst, uint64_t val) {
90
26.3k
    uint8_t buf[sizeof(val)];
91
26.3k
    encode_fixed64_le(buf, val);
92
26.3k
    dst->append((char*)buf, sizeof(buf));
93
26.3k
}
_ZN5doris14put_fixed64_leINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEvPT_m
Line
Count
Source
89
1.88k
void put_fixed64_le(T* dst, uint64_t val) {
90
1.88k
    uint8_t buf[sizeof(val)];
91
1.88k
    encode_fixed64_le(buf, val);
92
1.88k
    dst->append((char*)buf, sizeof(buf));
93
1.88k
}
_ZN5doris14put_fixed64_leINS_10faststringEEEvPT_m
Line
Count
Source
89
24.4k
void put_fixed64_le(T* dst, uint64_t val) {
90
24.4k
    uint8_t buf[sizeof(val)];
91
24.4k
    encode_fixed64_le(buf, val);
92
24.4k
    dst->append((char*)buf, sizeof(buf));
93
24.4k
}
94
95
// Returns the length of the varint32 or varint64 encoding of "v"
96
61
inline int varint_length(uint64_t v) {
97
61
    int len = 1;
98
61
    while (v >= 128) {
99
0
        v >>= 7;
100
0
        len++;
101
0
    }
102
61
    return len;
103
61
}
104
105
template <typename T>
106
24.4k
void put_fixed128_le(T* dst, uint128_t val) {
107
24.4k
    uint8_t buf[sizeof(val)];
108
24.4k
    encode_fixed128_le(buf, val);
109
24.4k
    dst->append((char*)buf, sizeof(buf));
110
24.4k
}
111
112
extern uint8_t* encode_varint32(uint8_t* dst, uint32_t value);
113
extern uint8_t* encode_varint64(uint8_t* dst, uint64_t value);
114
115
1.87M
inline uint8_t* encode_varint64(uint8_t* dst, uint64_t v) {
116
1.87M
    static const unsigned int B = 128;
117
3.99M
    while (v >= B) {
118
        // Fetch low seven bits from current v, and the eight bit is marked as compression mark.
119
        // v | B is optimised from (v & (B-1)) | B, because result is assigned to uint8_t and other bits
120
        // is cleared by implicit conversion.
121
2.11M
        *(dst++) = uint8_t(v | B);
122
2.11M
        v >>= 7;
123
2.11M
    }
124
1.87M
    *(dst++) = static_cast<unsigned char>(v);
125
1.87M
    return dst;
126
1.87M
}
127
128
extern const uint8_t* decode_varint32_ptr_fallback(const uint8_t* p, const uint8_t* limit,
129
                                                   uint32_t* value);
130
131
inline const uint8_t* decode_varint32_ptr(const uint8_t* ptr, const uint8_t* limit,
132
145M
                                          uint32_t* value) {
133
145M
    if (ptr < limit) {
134
145M
        uint32_t result = *ptr;
135
145M
        if ((result & 128) == 0) {
136
137M
            *value = result;
137
137M
            return ptr + 1;
138
137M
        }
139
145M
    }
140
7.63M
    return decode_varint32_ptr_fallback(ptr, limit, value);
141
145M
}
142
143
extern const uint8_t* decode_varint64_ptr(const uint8_t* p, const uint8_t* limit, uint64_t* value);
144
145
template <typename T>
146
33.5M
void put_varint32(T* dst, uint32_t v) {
147
33.5M
    uint8_t buf[16];
148
33.5M
    uint8_t* ptr = encode_varint32(buf, v);
149
33.5M
    dst->append((char*)buf, static_cast<size_t>(ptr - buf));
150
33.5M
}
151
152
template <typename T>
153
void put_varint64(T* dst, uint64_t v) {
154
    uint8_t buf[16];
155
    uint8_t* ptr = encode_varint64(buf, v);
156
    dst->append((char*)buf, static_cast<size_t>(ptr - buf));
157
}
158
159
template <typename T>
160
1.87M
void put_length_prefixed_slice(T* dst, const Slice& value) {
161
1.87M
    put_varint32(dst, uint32_t(value.get_size()));
162
1.87M
    dst->append(value.get_data(), value.get_size());
163
1.87M
}
164
165
template <typename T>
166
1.87M
void put_varint64_varint32(T* dst, uint64_t v1, uint32_t v2) {
167
1.87M
    uint8_t buf[16];
168
1.87M
    uint8_t* ptr = encode_varint64(buf, v1);
169
1.87M
    ptr = encode_varint32(ptr, v2);
170
1.87M
    dst->append((char*)buf, static_cast<size_t>(ptr - buf));
171
1.87M
}
172
173
// parse a varint32 from the start of `input` into `val`.
174
// on success, return true and advance `input` past the parsed value.
175
// on failure, return false and `input` is not modified.
176
16.3M
inline bool get_varint32(Slice* input, uint32_t* val) {
177
16.3M
    const auto* p = (const uint8_t*)input->data;
178
16.3M
    const uint8_t* limit = p + input->size;
179
16.3M
    const uint8_t* q = decode_varint32_ptr(p, limit, val);
180
16.3M
    if (q == nullptr) {
181
0
        return false;
182
16.3M
    } else {
183
16.3M
        *input = Slice(q, limit - q);
184
16.3M
        return true;
185
16.3M
    }
186
16.3M
}
187
188
// parse a varint64 from the start of `input` into `val`.
189
// on success, return true and advance `input` past the parsed value.
190
// on failure, return false and `input` is not modified.
191
7.68M
inline bool get_varint64(Slice* input, uint64_t* val) {
192
7.68M
    const auto* p = (const uint8_t*)input->data;
193
7.68M
    const uint8_t* limit = p + input->size;
194
7.68M
    const uint8_t* q = decode_varint64_ptr(p, limit, val);
195
7.68M
    if (q == nullptr) {
196
0
        return false;
197
7.68M
    } else {
198
7.68M
        *input = Slice(q, limit - q);
199
7.68M
        return true;
200
7.68M
    }
201
7.68M
}
202
203
// parse a length-prefixed-slice from the start of `input` into `val`.
204
// on success, return true and advance `input` past the parsed value.
205
// on failure, return false and `input` may or may not be modified.
206
7.63M
inline bool get_length_prefixed_slice(Slice* input, Slice* val) {
207
7.63M
    uint32_t len;
208
7.69M
    if (get_varint32(input, &len) && input->get_size() >= len) {
209
7.65M
        *val = Slice(input->get_data(), len);
210
7.65M
        input->remove_prefix(len);
211
7.65M
        return true;
212
18.4E
    } else {
213
18.4E
        return false;
214
18.4E
    }
215
7.63M
}
216
#include "common/compile_check_end.h"
217
} // namespace doris