diff --git a/dbms/include/DB/IO/VarInt.h b/dbms/include/DB/IO/VarInt.h index a0ea751ab5c..42efa059f97 100644 --- a/dbms/include/DB/IO/VarInt.h +++ b/dbms/include/DB/IO/VarInt.h @@ -105,81 +105,17 @@ inline void readVarInt(Int16 & x, ReadBuffer & istr) inline void writeVarUInt(UInt64 x, std::ostream & ostr) { - char buf[9]; + for (size_t i = 0; i < 9; ++i) + { + uint8_t byte = x & 0x7F; + if (byte > 0x7F) + x |= 0x80; - buf[0] = static_cast(x | 0x80); - if (x >= (1ULL << 7)) - { - buf[1] = static_cast((x >> 7) | 0x80); - if (x >= (1ULL << 14)) - { - buf[2] = static_cast((x >> 14) | 0x80); - if (x >= (1ULL << 21)) - { - buf[3] = static_cast((x >> 21) | 0x80); - if (x >= (1ULL << 28)) - { - buf[4] = static_cast((x >> 28) | 0x80); - if (x >= (1ULL << 35)) - { - buf[5] = static_cast((x >> 35) | 0x80); - if (x >= (1ULL << 42)) - { - buf[6] = static_cast((x >> 42) | 0x80); - if (x >= (1ULL << 49)) - { - buf[7] = static_cast((x >> 49) | 0x80); - if (x >= (1ULL << 56)) - { - buf[8] = static_cast(x >> 56); - ostr.write(buf, 9); - } - else - { - buf[7] &= 0x7F; - ostr.write(buf, 8); - } - } - else - { - buf[6] &= 0x7F; - ostr.write(buf, 7); - } - } - else - { - buf[5] &= 0x7F; - ostr.write(buf, 6); - } - } - else - { - buf[4] &= 0x7F; - ostr.write(buf, 5); - } - } - else - { - buf[3] &= 0x7F; - ostr.write(buf, 4); - } - } - else - { - buf[2] &= 0x7F; - ostr.write(buf, 3); - } - } - else - { - buf[1] &= 0x7F; - ostr.write(buf, 2); - } - } - else - { - buf[0] &= 0x7F; - ostr.write(buf, 1); + ostr.put(x); + + x >>= 7; + if (!x) + return; } } @@ -197,9 +133,9 @@ inline void readVarUInt(UInt64 & x, ReadBuffer & istr) if (istr.eof()) throwReadAfterEOF(); - int byte = *istr.position(); + uint64_t byte = *istr.position(); ++istr.position(); - x |= (static_cast(byte) & 0x7F) << (7 * i); + x |= (byte & 0x7F) << (7 * i); if (!(byte & 0x80)) return; @@ -209,187 +145,54 @@ inline void readVarUInt(UInt64 & x, ReadBuffer & istr) inline void readVarUInt(UInt64 & x, std::istream & istr) { - int byte; - - byte = istr.get(); - x = static_cast(byte) & 0x7F; - if (byte & 0x80) + x = 0; + for (size_t i = 0; i < 9; ++i) { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 7; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 14; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 21; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 28; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 35; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 42; - if (byte & 0x80) - { - byte = istr.get(); - x |= (static_cast(byte) & 0x7F) << 49; - if (byte & 0x80) - { - byte = istr.get(); - x |= static_cast(byte) << 56; - } - } - } - } - } - } - } + uint64_t byte = istr.get(); + x |= (byte & 0x7F) << (7 * i); + + if (!(byte & 0x80)) + return; } } inline void writeVarUInt(UInt64 x, WriteBuffer & ostr) { - char buf[9]; + for (size_t i = 0; i < 9; ++i) + { + uint8_t byte = x & 0x7F; + if (byte > 0x7F) + x |= 0x80; - buf[0] = static_cast(x | 0x80); - if (x >= (1ULL << 7)) - { - buf[1] = static_cast((x >> 7) | 0x80); - if (x >= (1ULL << 14)) - { - buf[2] = static_cast((x >> 14) | 0x80); - if (x >= (1ULL << 21)) - { - buf[3] = static_cast((x >> 21) | 0x80); - if (x >= (1ULL << 28)) - { - buf[4] = static_cast((x >> 28) | 0x80); - if (x >= (1ULL << 35)) - { - buf[5] = static_cast((x >> 35) | 0x80); - if (x >= (1ULL << 42)) - { - buf[6] = static_cast((x >> 42) | 0x80); - if (x >= (1ULL << 49)) - { - buf[7] = static_cast((x >> 49) | 0x80); - if (x >= (1ULL << 56)) - { - buf[8] = static_cast(x >> 56); - ostr.write(buf, 9); - } - else - { - buf[7] &= 0x7F; - ostr.write(buf, 8); - } - } - else - { - buf[6] &= 0x7F; - ostr.write(buf, 7); - } - } - else - { - buf[5] &= 0x7F; - ostr.write(buf, 6); - } - } - else - { - buf[4] &= 0x7F; - ostr.write(buf, 5); - } - } - else - { - buf[3] &= 0x7F; - ostr.write(buf, 4); - } - } - else - { - buf[2] &= 0x7F; - ostr.write(buf, 3); - } - } - else - { - buf[1] &= 0x7F; - ostr.write(buf, 2); - } - } - else - { - buf[0] &= 0x7F; - ostr.write(buf, 1); + ostr.nextIfAtEnd(); + *ostr.position() = x; + ++ostr.position(); + + x >>= 7; + if (!x) + return; } } inline char * writeVarUInt(UInt64 x, char * ostr) { - *ostr = static_cast(x | 0x80); - if (x >= (1ULL << 7)) + for (size_t i = 0; i < 9; ++i) { - *++ostr = static_cast((x >> 7) | 0x80); - if (x >= (1ULL << 14)) - { - *++ostr = static_cast((x >> 14) | 0x80); - if (x >= (1ULL << 21)) - { - *++ostr = static_cast((x >> 21) | 0x80); - if (x >= (1ULL << 28)) - { - *++ostr = static_cast((x >> 28) | 0x80); - if (x >= (1ULL << 35)) - { - *++ostr = static_cast((x >> 35) | 0x80); - if (x >= (1ULL << 42)) - { - *++ostr = static_cast((x >> 42) | 0x80); - if (x >= (1ULL << 49)) - { - *++ostr = static_cast((x >> 49) | 0x80); - if (x >= (1ULL << 56)) - { - *++ostr = static_cast(x >> 56); - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; - } - else - *ostr &= 0x7F; + uint8_t byte = x & 0x7F; + if (byte > 0x7F) + x |= 0x80; - return ++ostr; + *ostr = x; + ++ostr; + + x >>= 7; + if (!x) + return ostr; + } + + return ostr; } @@ -397,41 +200,21 @@ inline const char * readVarUInt(UInt64 & x, const char * istr, size_t size) { const char * end = istr + size; - x = static_cast(*istr) & 0x7F; - if (*istr & 0x80 && ++istr < end) + x = 0; + for (size_t i = 0; i < 9; ++i) { - x |= (static_cast(*istr) & 0x7F) << 7; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 14; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 21; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 28; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 35; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 42; - if (*istr & 0x80 && ++istr < end) - { - x |= (static_cast(*istr) & 0x7F) << 49; - if (*istr & 0x80 && ++istr < end) - { - x |= static_cast(*istr) << 56; - } - } - } - } - } - } - } + if (istr == end) + throwReadAfterEOF(); + + uint64_t byte = *istr; + ++istr; + x |= (byte & 0x7F) << (7 * i); + + if (!(byte & 0x80)) + return istr; } - return ++istr; + return istr; }