From 6a88f936198313241f464032dbf70f47ea5e7622 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Sun, 17 Nov 2024 03:17:16 -0800 Subject: [PATCH] feat(big): implement ToStream and EncodeDataBytes ops --- storm/big/Ops.cpp | 15 ++++++++++++++ storm/big/Ops.hpp | 4 ++++ test/big/Ops.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index a835267..fe636b5 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -131,6 +131,15 @@ void Div(BigBuffer& a, BigBuffer& b, const BigBuffer& c, const BigBuffer& d, Big stack.Free(allocCount); } +void EncodeDataBytes(TSGrowableArray& output, uint32_t value) { + uint32_t v = value; + while (v != 0) { + *output.New() = v % 255u; + v /= 255u; + } + *output.New() = 255; +} + uint32_t ExtractLowPart(uint64_t& value) { auto low = static_cast(value); value >>= 32; @@ -467,3 +476,9 @@ void ToBinary(TSGrowableArray& output, const BigBuffer& buffer) { output.SetCount(0); ToBinaryAppend(output, buffer); } + +void ToStream(TSGrowableArray& output, const BigBuffer& buffer) { + ToBinary(output, buffer); + EncodeDataBytes(output, output.Count()); + ToBinaryAppend(output, buffer); +} diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index 10ec817..3743078 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -17,6 +17,8 @@ void Div(BigBuffer& a, uint32_t* b, const BigBuffer& c, uint64_t d); void Div(BigBuffer& a, BigBuffer& b, const BigBuffer& c, const BigBuffer& d, BigStack& stack); +void EncodeDataBytes(TSGrowableArray& output, uint32_t value); + uint32_t ExtractLowPart(uint64_t& value); uint32_t ExtractLowPartLargeSum(uint64_t& value, uint64_t add); @@ -71,4 +73,6 @@ void Sub(BigBuffer& a, const BigBuffer& b, uint32_t c); void ToBinary(TSGrowableArray& output, const BigBuffer& buffer); +void ToStream(TSGrowableArray& output, const BigBuffer& buffer); + #endif diff --git a/test/big/Ops.cpp b/test/big/Ops.cpp index c7c04ba..935c060 100644 --- a/test/big/Ops.cpp +++ b/test/big/Ops.cpp @@ -1,6 +1,7 @@ #include "storm/Big.hpp" #include "storm/big/Ops.hpp" #include "test/Test.hpp" +#include TEST_CASE("Add", "[big]") { BigDataTest a, b; @@ -280,6 +281,28 @@ TEST_CASE("Div", "[big]") { } } +TEST_CASE("EncodeDataBytes", "[big]") { + struct EncodeTestCase { + uint32_t input; + std::vector output; + }; + + SECTION("encodes values to array") { + auto v = GENERATE( + EncodeTestCase{ 0, { 255 } }, + EncodeTestCase{ 1, { 1, 255 } }, + EncodeTestCase{ 255, { 0, 1, 255 } }, + EncodeTestCase{ UINT32_MAX, { 0, 4, 6, 4, 1, 255 } } + ); + + TSGrowableArray arr; + EncodeDataBytes(arr, v.input); + + CHECK(arr.Count() == v.output.size()); + CHECK(std::vector(arr.m_data, arr.m_data + arr.Count()) == v.output); + } +} + TEST_CASE("ExtractLowPart", "[big]") { SECTION("extracts low part of 0") { uint64_t value = 0; @@ -1045,5 +1068,30 @@ TEST_CASE("Sub", "[big]") { CHECK(a->Primary()[0] == 0xDB975320); CHECK(a->Primary()[1] == 0xECA8641F); } - +} + + +TEST_CASE("ToStream", "[big]") { + BigDataTest a; + + struct ToStreamTestCase { + uint64_t input; + std::vector output; + }; + + SECTION("streams buffers to array") { + auto v = GENERATE( + ToStreamTestCase{ 0, { 255 } }, + ToStreamTestCase{ 1, { 1, 1, 255, 1 } }, + ToStreamTestCase{ 255, { 0xFF, 1, 255, 0xFF } }, + ToStreamTestCase{ UINT32_MAX, { 0xFF, 0xFF, 0xFF, 0xFF, 4, 255, 0xFF, 0xFF, 0xFF, 0xFF } }, + ToStreamTestCase{ 0x123456789ABCDEF0, { 0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 8, 255, 0xF0, 0xDE, 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12 } } + ); + + TSGrowableArray arr; + SBigFromStr(a, std::to_string(v.input).c_str()); + ToStream(arr, a->Primary()); + + CHECK(std::vector(arr.m_data, arr.m_data + arr.Count()) == v.output); + } }