1 #ifndef OSMSCOUT_NUMBER_H 2 #define OSMSCOUT_NUMBER_H 57 number^=
static_cast<N
>(-1);
58 val=
static_cast<char>((number & 0x3f) << 1 | 0x01);
61 val=
static_cast<char>((number & 0x3f) << 1);
67 *(buffer++)=val | 0x80;
68 val=
static_cast<char>(number & 0x7f);
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)
119 return EncodeNumberSigned<N>(number,buffer);
126 static inline unsigned int f(N number,
char* buffer)
128 return EncodeNumberUnsigned<N>(number,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 & 0x01)!=0) {
196 N val=(*buffer & 0x7e) >> 1;
201 while ((*(buffer++) & 0x80)!=0) {
202 number^=(val << shift);
209 number^=
static_cast<N
>(val) << shift;
212 N val=(*buffer & 0x7e) >> 1;
217 while ((*(buffer++) & 0x80)!=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)
273 return DecodeNumberSigned<N>(buffer,number);
280 static inline unsigned int f(
const char* buffer, N& number)
282 return DecodeNumberUnsigned<N>(buffer,number);
308 return bits%8==0 ? bits/8 : bits/8+1;
unsigned int DecodeNumberUnsigned(const char *buffer, N &number)
Definition: Number.h:239
unsigned int EncodeNumberUnsigned(N number, char *buffer)
Definition: Number.h:92
static unsigned int f(N number, char *buffer)
Definition: Number.h:126
N BitsToBytes(N bits)
Definition: Number.h:306
uint8_t BytesNeededToEncodeNumber(N number)
Definition: Number.h:318
unsigned int EncodeNumberSigned(N number, char *buffer)
Definition: Number.h:50
unsigned int DecodeNumber(const char *buffer, N &number)
Definition: Number.h:294
static unsigned int f(N number, char *buffer)
Definition: Number.h:117
OSMSCOUT_API uint64_t InterleaveNumbers(uint32_t a, uint32_t b)
#define OSMSCOUT_API
Definition: CoreImportExport.h:45
unsigned int EncodeNumber(N number, char *buffer)
Definition: Number.h:145
static unsigned int f(const char *buffer, N &number)
Definition: Number.h:271
unsigned int DecodeNumberSigned(const char *buffer, N &number)
Definition: Number.h:187
static unsigned int f(const char *buffer, N &number)
Definition: Number.h:280
uint8_t BitsNeededToEncodeNumber(N number)
Definition: Number.h:341