ClickHouse/dbms/include/DB/IO/VarInt.h

106 lines
3.1 KiB
C
Raw Normal View History

#pragma once
2010-03-01 16:59:51 +00:00
#include <DB/Core/Types.h>
2010-06-04 18:25:25 +00:00
#include <DB/IO/ReadBuffer.h>
#include <DB/IO/WriteBuffer.h>
2010-03-01 16:59:51 +00:00
namespace DB
{
/** Записать UInt64 в формате переменной длины (base128) */
void writeVarUInt(UInt64 x, std::ostream & ostr);
2010-06-01 14:12:28 +00:00
void writeVarUInt(UInt64 x, WriteBuffer & ostr);
2011-03-17 19:45:21 +00:00
char * writeVarUInt(UInt64 x, char * ostr);
2010-03-01 16:59:51 +00:00
/** Прочитать UInt64, записанный в формате переменной длины (base128) */
void readVarUInt(UInt64 & x, std::istream & istr);
2010-06-01 14:12:28 +00:00
void readVarUInt(UInt64 & x, ReadBuffer & istr);
2011-03-22 20:36:01 +00:00
const char * readVarUInt(UInt64 & x, const char * istr, size_t size);
2010-03-01 16:59:51 +00:00
/** Получить длину UInt64 в формате VarUInt */
size_t getLengthOfVarUInt(UInt64 x);
/** Получить длину Int64 в формате VarInt */
size_t getLengthOfVarInt(Int64 x);
2010-03-01 16:59:51 +00:00
/** Записать Int64 в формате переменной длины (base128) */
2010-06-01 14:12:28 +00:00
template <typename OUT>
inline void writeVarInt(Int64 x, OUT & ostr)
2010-03-01 16:59:51 +00:00
{
writeVarUInt(static_cast<UInt64>((x << 1) ^ (x >> 63)), ostr);
}
2011-03-22 20:36:01 +00:00
inline char * writeVarInt(Int64 x, char * ostr)
{
return writeVarUInt(static_cast<UInt64>((x << 1) ^ (x >> 63)), ostr);
}
2010-03-01 16:59:51 +00:00
/** Прочитать Int64, записанный в формате переменной длины (base128) */
2010-06-01 14:12:28 +00:00
template <typename IN>
inline void readVarInt(Int64 & x, IN & istr)
2010-03-01 16:59:51 +00:00
{
readVarUInt(*reinterpret_cast<UInt64*>(&x), istr);
x = (static_cast<UInt64>(x) >> 1) ^ -(x & 1);
}
2011-03-22 20:36:01 +00:00
inline const char * readVarInt(Int64 & x, const char * istr, size_t size)
{
const char * res = readVarUInt(*reinterpret_cast<UInt64*>(&x), istr, size);
x = (static_cast<UInt64>(x) >> 1) ^ -(x & 1);
return res;
}
2010-03-01 16:59:51 +00:00
2010-06-01 14:12:28 +00:00
inline void writeVarT(UInt64 x, std::ostream & ostr) { writeVarUInt(x, ostr); }
inline void writeVarT(Int64 x, std::ostream & ostr) { writeVarInt(x, ostr); }
inline void writeVarT(UInt64 x, WriteBuffer & ostr) { writeVarUInt(x, ostr); }
inline void writeVarT(Int64 x, WriteBuffer & ostr) { writeVarInt(x, ostr); }
2011-03-22 20:36:01 +00:00
inline char * writeVarT(UInt64 x, char * & ostr) { return writeVarUInt(x, ostr); }
inline char * writeVarT(Int64 x, char * & ostr) { return writeVarInt(x, ostr); }
2010-05-18 18:51:51 +00:00
2010-06-01 14:12:28 +00:00
inline void readVarT(UInt64 & x, std::istream & istr) { readVarUInt(x, istr); }
inline void readVarT(Int64 & x, std::istream & istr) { readVarInt(x, istr); }
inline void readVarT(UInt64 & x, ReadBuffer & istr) { readVarUInt(x, istr); }
inline void readVarT(Int64 & x, ReadBuffer & istr) { readVarInt(x, istr); }
2011-03-22 20:36:01 +00:00
inline const char * readVarT(UInt64 & x, const char * istr, size_t size) { return readVarUInt(x, istr, size); }
inline const char * readVarT(Int64 & x, const char * istr, size_t size) { return readVarInt(x, istr, size); }
2010-05-18 18:51:51 +00:00
/// Для [U]Int32, [U]Int16.
inline void readVarUInt(UInt32 & x, ReadBuffer & istr)
{
UInt64 tmp;
readVarUInt(tmp, istr);
x = tmp;
2010-03-01 16:59:51 +00:00
}
inline void readVarInt(Int32 & x, ReadBuffer & istr)
{
Int64 tmp;
readVarInt(tmp, istr);
x = tmp;
}
inline void readVarUInt(UInt16 & x, ReadBuffer & istr)
{
UInt64 tmp;
readVarUInt(tmp, istr);
x = tmp;
}
inline void readVarInt(Int16 & x, ReadBuffer & istr)
{
Int64 tmp;
readVarInt(tmp, istr);
x = tmp;
}
}