VarInt: added method getLengthOfVarUInt().

This commit is contained in:
Alexey Milovidov 2010-01-21 18:23:34 +00:00
parent d0c2a744fe
commit 37d340b404
2 changed files with 21 additions and 2 deletions

View File

@ -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);
}

View File

@ -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)))))));
}
}