GeoDesk for C++
Fast and storage-efficient spatial database engine for OpenStreetMap features
Loading...
Searching...
No Matches
varint_safe.h
Go to the documentation of this file.
1// Copyright (c) 2024 Clarisma / GeoDesk contributors
2// SPDX-License-Identifier: LGPL-3.0-only
3
4#pragma once
5
6#include <cassert>
7#include <stdexcept>
8#include <cstdint>
10
11namespace clarisma {
12
13inline uint64_t safeReadVarint64(const uint8_t*& p, const uint8_t* end)
14{
15 uint64_t val = 0;
16 int shift = 0;
17 while(p < end)
18 {
19 uint64_t b = *p++;
20 val |= (b & 0x7f) << shift;
21 shift += 7;
22 if ((b & 0x80) == 0) return val;
23 if(shift > 63)
24 {
25 throw std::runtime_error("Invalid varint (more than 10 bytes)");
26 }
27 }
28 throw std::runtime_error("Invalid varint (extends past end of buffer)");
29}
30
31inline uint32_t safeReadVarint32(const uint8_t*& p, const uint8_t* end)
32{
33 uint32_t val = 0;
34 int shift = 0;
35 while(p < end)
36 {
37 uint32_t b = *p++;
38 val |= (b & 0x7f) << shift;
39 shift += 7;
40 if ((b & 0x80) == 0) return val;
41 if(shift > 28)
42 {
43 throw std::runtime_error("Invalid varint (more than 5 bytes)");
44 }
45 }
46 throw std::runtime_error("Invalid varint (extends past end of buffer)");
47}
48
49inline int32_t safeReadSignedVarint32(const uint8_t*& p, const uint8_t* end)
50{
51 int64_t val = static_cast<int64_t>(safeReadVarint64(p, end));
52 return static_cast<int32_t>((val >> 1) ^ -(val & 1));
53}
54
55inline int64_t safeReadSignedVarint64(const uint8_t*& p, const uint8_t* end)
56{
57 int64_t val = static_cast<int64_t>(safeReadVarint64(p, end));
58 return (val >> 1) ^ -(val & 1);
59}
60
61inline void safeSkipVarints(const uint8_t*& p, int count, const uint8_t* end)
62{
63 while(count)
64 {
65 if(p >= end)
66 {
67 throw std::runtime_error("Varints extend past end of buffer");
68 }
69 uint8_t b = *p++;
70 count -= (b >> 7) ^ 1;
71 }
72}
73
74} // namespace clarisma
Definition Arena.h:17
uint32_t safeReadVarint32(const uint8_t *&p, const uint8_t *end)
Definition varint_safe.h:31
int32_t safeReadSignedVarint32(const uint8_t *&p, const uint8_t *end)
Definition varint_safe.h:49
int64_t safeReadSignedVarint64(const uint8_t *&p, const uint8_t *end)
Definition varint_safe.h:55
void safeSkipVarints(const uint8_t *&p, int count, const uint8_t *end)
Definition varint_safe.h:61
uint64_t safeReadVarint64(const uint8_t *&p, const uint8_t *end)
Definition varint_safe.h:13