1#ifndef OSMSCOUT_NUMBER_H
2#define OSMSCOUT_NUMBER_H
57 number^=
static_cast<N
>(-1);
58 val=
static_cast<char>((number & 0x3fu) << 1 | 0x01u);
61 val=
static_cast<char>((number & 0x3fu) << 1);
67 *(buffer++)=val | 0x80u;
68 val=
static_cast<char>(number & 0x7fu);
98 buffer[bytes]=
static_cast<char>((number & 0x7f) | 0x80);
103 buffer[bytes]=
static_cast<char>(number);
109 template<
bool is_
signed,
typename N>
117 static inline unsigned int f(N number,
char* buffer)
126 static inline unsigned int f(N number,
char* buffer)
164 template<
typename N,
size_t S>
166 std::array<char, S> &buffer)
168 if constexpr (std::numeric_limits<N>::is_signed) {
169 static_assert(
sizeof(N) * 64 + 7 <= S * 56,
"Not enough big buffer for encoding signed number");
171 static_assert(
sizeof(N) * 64 <= S * 56,
"Not enough big buffer for encoding unsigned number");
174 ::f(number,buffer.data());
175 assert(dataWritten<=S);
190 unsigned int shift=0;
191 unsigned int nextShift=0;
192 unsigned int bytes=1;
195 if ((*buffer & 0x01u)!=0) {
196 N val=(*buffer & 0x7eu) >> 1;
201 while ((*(buffer++) & 0x80u)!=0) {
202 number^=(val << shift);
209 number^=
static_cast<N
>(val) << shift;
212 N val=(*buffer & 0x7eu) >> 1;
217 while ((*(buffer++) & 0x80u)!=0) {
218 number|=(val << shift);
225 number|=
static_cast<N
>(val) << shift;
242 unsigned int shift=0;
243 unsigned int bytes=1;
248 number|=
static_cast<N
>(*buffer & 0x7f) << shift;
250 if (((*buffer) & 0x80)==0) {
263 template<
bool is_
signed,
typename N>
271 static inline unsigned int f(
const char* buffer, N& number)
280 static inline unsigned int f(
const char* buffer, N& number)
308 return bits%8==0 ? bits/8 : bits/8+1;
#define OSMSCOUT_API
Definition CoreImportExport.h:45
unsigned int DecodeNumber(const char *buffer, N &number)
Definition Number.h:294
unsigned int DecodeNumberUnsigned(const char *buffer, N &number)
Definition Number.h:239
uint8_t BytesNeededToEncodeNumber(N number)
Definition Number.h:318
N BitsToBytes(N bits)
Definition Number.h:306
unsigned int EncodeNumberUnsigned(N number, char *buffer)
Definition Number.h:92
OSMSCOUT_API uint64_t InterleaveNumbers(uint32_t a, uint32_t b)
unsigned int EncodeNumber(N number, char *buffer)
Definition Number.h:145
unsigned int DecodeNumberSigned(const char *buffer, N &number)
Definition Number.h:187
unsigned int EncodeNumberSigned(N number, char *buffer)
Definition Number.h:50
uint8_t BitsNeededToEncodeNumber(N number)
Definition Number.h:341
static unsigned int f(const char *buffer, N &number)
Definition Number.h:280
static unsigned int f(const char *buffer, N &number)
Definition Number.h:271
static unsigned int f(N number, char *buffer)
Definition Number.h:126
static unsigned int f(N number, char *buffer)
Definition Number.h:117