mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
VarInt: added method getLengthOfVarUInt().
This commit is contained in:
parent
d0c2a744fe
commit
37d340b404
@ -16,6 +16,10 @@ void writeVarUInt(UInt x, std::ostream & ostr);
|
||||
void readVarUInt(UInt & x, std::istream & istr);
|
||||
|
||||
|
||||
/** Получить длину UInt64 в формате VarUInt */
|
||||
size_t getLengthOfVarUInt(UInt x);
|
||||
|
||||
|
||||
/** Записать Int64 в формате переменной длины (base128) */
|
||||
inline void writeVarInt(Int x, std::ostream & ostr)
|
||||
{
|
||||
@ -23,11 +27,12 @@ inline void writeVarInt(Int x, std::ostream & ostr)
|
||||
}
|
||||
|
||||
|
||||
// TODO: здесь баг
|
||||
/** Прочитать Int64, записанный в формате переменной длины (base128) */
|
||||
inline void readVarInt(Int & x, std::istream & istr)
|
||||
{
|
||||
readVarUInt(reinterpret_cast<UInt&>(x), istr);
|
||||
x = ((x >> 1) ^ (x << 63));
|
||||
readVarUInt(*reinterpret_cast<UInt*>(&x), istr);
|
||||
x = (x >> 1) ^ (x << 63);
|
||||
}
|
||||
|
||||
|
||||
|
@ -137,4 +137,18 @@ void readVarUInt(UInt & x, std::istream & istr)
|
||||
}
|
||||
|
||||
|
||||
size_t getLengthOfVarUInt(UInt x)
|
||||
{
|
||||
return x < (1ULL << 7) ? 1
|
||||
: (x < (1ULL << 14) ? 2
|
||||
: (x < (1ULL << 21) ? 3
|
||||
: (x < (1ULL << 28) ? 4
|
||||
: (x < (1ULL << 35) ? 5
|
||||
: (x < (1ULL << 42) ? 6
|
||||
: (x < (1ULL << 49) ? 7
|
||||
: (x < (1ULL << 56) ? 8
|
||||
: 9)))))));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user