From 7108e71b9608002435fab0fe44a2d46506235972 Mon Sep 17 00:00:00 2001 From: BodgeMaster <> Date: Tue, 20 Dec 2022 04:41:09 +0100 Subject: [PATCH] lib/varint: Add toVarN() functions --- src/lib/varint.hpp | 53 +++++++++++++++++++++++++++++++ src/test/varint.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/src/lib/varint.hpp b/src/lib/varint.hpp index 4e4382e..8feb23e 100644 --- a/src/lib/varint.hpp +++ b/src/lib/varint.hpp @@ -83,4 +83,57 @@ namespace VarInt { return ErrorOr(returnValue); } + + // appends to the vector + void toVar32(int32_t value, std::vector &data) { + uint8_t nextByte; + uint8_t shift = 0; + // do something else after the 4th shift + while (shift < 4) { + if (shift>0 && value==0) { + return; + } + + nextByte = value & 0b01111111; + + value = (value >> 7) & 0x01FFFFFF; + shift++; + + + if (value>0) { + nextByte = nextByte + 0b10000000; + } + data.push_back(nextByte); + + } + if (value>0) { + data.push_back(value & 0b00001111); + } + } + + // appends to the vector + void toVar64(int64_t value, std::vector &data) { + uint8_t nextByte; + uint8_t shift = 0; + // do something else after the 4th shift + while (shift < 9) { + if (shift>0 && value==0) { + return; + } + + nextByte = value & 0b01111111; + + value = (value >> 7) & 0x01FFFFFFFFFFFFFF; + shift++; + + if (value>0) { + nextByte = nextByte + 0b10000000; + } + data.push_back(nextByte); + + } + if (value>0) { + data.push_back(value & 0b00000001); + } + } } diff --git a/src/test/varint.cpp b/src/test/varint.cpp index 90e70a7..2902f39 100644 --- a/src/test/varint.cpp +++ b/src/test/varint.cpp @@ -158,6 +158,82 @@ int main() { std::cout << "Passed fromVar64 test." << std::endl; + // reversing all the previous tests + std::vector dataDump; + + VarInt::toVar32(0, dataDump); + ASSERT(dataDump[0] == 0); + + VarInt::toVar32(-1, dataDump); + ASSERT( + dataDump[1]==255 && + dataDump[2]==255 && + dataDump[3]==255 && + dataDump[4]==255 && + dataDump[5]==15 + ); + + VarInt::toVar32(4369, dataDump); + ASSERT( + dataDump[6]==0b10010001 && + dataDump[7]==0b00100010 + ); + + VarInt::toVar32(2375101, dataDump); + ASSERT( + dataDump[8]==0b10111101 && + dataDump[9]==0b11111011 && + dataDump[10]==0b10010000 && + dataDump[11]==0b00000001 + ); + + std::cout << "Passed toVar32 test." << std::endl; + + VarInt::toVar64(0, dataDump); + ASSERT(dataDump[12]==0); + + VarInt::toVar64(-1, dataDump); + ASSERT( + dataDump[13]==255 && + dataDump[14]==255 && + dataDump[15]==255 && + dataDump[16]==255 && + dataDump[17]==255 && + dataDump[18]==255 && + dataDump[19]==255 && + dataDump[20]==255 && + dataDump[21]==255 && + dataDump[22]==1 + ); + + VarInt::toVar64(2310347307446489235, dataDump); + ASSERT( + dataDump[23]==0b10010011 && + dataDump[24]==0b10100001 && + dataDump[25]==0b10000011 && + dataDump[26]==0b11000001 && + dataDump[27]==0b10101010 && + dataDump[28]==0b10010100 && + dataDump[29]==0b10000000 && + dataDump[30]==0b10001000 && + dataDump[31]==0b00100000 + ); + + VarInt::toVar64(-9205322385119247871, dataDump); + ASSERT( + dataDump[32]==0b10000001 && + dataDump[33]==0b10000100 && + dataDump[34]==0b10010000 && + dataDump[35]==0b11000000 && + dataDump[36]==0b10000000 && + dataDump[37]==0b10000010 && + dataDump[38]==0b10001000 && + dataDump[39]==0b10100000 && + dataDump[40]==0b10000000 && + dataDump[41]==0b00000001 + ) + + std::cout << "Passed toVar64 test." << std::endl; return 0; }