From fac094793a9767cafa3b4a96a35a9e069b4a680c Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Fri, 15 Nov 2024 03:22:16 -0800 Subject: [PATCH] feat(big): add SBigDec --- storm/Big.cpp | 4 +++ storm/Big.hpp | 2 ++ storm/big/Ops.cpp | 13 ++++++++ storm/big/Ops.hpp | 2 ++ test/Big.cpp | 44 +++++++++++++++++++------ test/big/Ops.cpp | 82 ++++++++++++++++++++++++----------------------- 6 files changed, 97 insertions(+), 50 deletions(-) diff --git a/storm/Big.cpp b/storm/Big.cpp index ce8aade..de16fbe 100644 --- a/storm/Big.cpp +++ b/storm/Big.cpp @@ -36,6 +36,10 @@ void SBigCopy(BigData* a, BigData* b) { a->m_primary = b->m_primary; } +void SBigDec(BigData* a, BigData* b) { + Sub(a->m_primary, b->m_primary, 1); +} + void SBigDel(BigData* num) { delete num; } diff --git a/storm/Big.hpp b/storm/Big.hpp index bf73ab1..086395a 100644 --- a/storm/Big.hpp +++ b/storm/Big.hpp @@ -14,6 +14,8 @@ int32_t SBigCompare(BigData* a, BigData* b); void SBigCopy(BigData* a, BigData* b); +void SBigDec(BigData* a, BigData* b); + void SBigDel(BigData* num); void SBigFromBinary(BigData* num, const void* data, uint32_t bytes); diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index 01996a6..9b0b17c 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -392,7 +392,20 @@ void Sub(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) { } a.SetCount(i); + // This assert does not exist in retail WoW or Starcraft. + //STORM_ASSERT(!borrow); +} +void Sub(BigBuffer& a, const BigBuffer& b, uint32_t c) { + uint64_t borrow = 0; + + uint32_t i = 0; + for (; b.IsUsed(i); i++) { + borrow += b[i] - static_cast(c);; + a[i] = ExtractLowPartSx(borrow); + } + + a.SetCount(i); // This assert does not exist in retail WoW or Starcraft. //STORM_ASSERT(!borrow); } diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index d153f5d..b781a7e 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -53,6 +53,8 @@ void Square(BigBuffer& a, const BigBuffer& b, BigStack& stack); void Sub(BigBuffer& a, const BigBuffer& b, const BigBuffer& c); +void Sub(BigBuffer& a, const BigBuffer& b, uint32_t c); + void ToBinary(TSGrowableArray& output, const BigBuffer& buffer); #endif diff --git a/test/Big.cpp b/test/Big.cpp index 48ab0c6..a109b2d 100644 --- a/test/Big.cpp +++ b/test/Big.cpp @@ -231,6 +231,29 @@ TEST_CASE("SBigCopy", "[big]") { } } +TEST_CASE("SBigDec", "[big]") { + BigDataTest a; + BigDataTest b; + + SECTION("decrements value by 1") { + SBigFromUnsigned(b, 5); + + SBigDec(a, b); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 4); + } + + SECTION("decrements from 0") { + SBigFromUnsigned(b, 0); + + SBigDec(a, b); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 0xFFFFFFFF); + } +} + TEST_CASE("SBigFromBinary", "[big]") { SECTION("creates bigdata from 0") { BigData* num; @@ -569,16 +592,10 @@ TEST_CASE("SBigSquare", "[big]") { } TEST_CASE("SBigSub", "[big]") { + BigDataTest a, b, c; + SECTION("subtracts 1 from 2") { - BigData* a; - SBigNew(&a); - - BigData* b; - SBigNew(&b); SBigFromUnsigned(b, 2); - - BigData* c; - SBigNew(&c); SBigFromUnsigned(c, 1); SBigSub(a, b, c); @@ -587,9 +604,16 @@ TEST_CASE("SBigSub", "[big]") { CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 1); + } - SBigDel(a); - SBigDel(b); + SECTION("subtracts 1 from 0") { + SBigFromUnsigned(b, 0); + SBigFromUnsigned(c, 1); + + SBigSub(a, b, c); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 0xFFFFFFFF); } } diff --git a/test/big/Ops.cpp b/test/big/Ops.cpp index a003b46..78cb50d 100644 --- a/test/big/Ops.cpp +++ b/test/big/Ops.cpp @@ -1461,16 +1461,10 @@ TEST_CASE("Square", "[big]") { } TEST_CASE("Sub", "[big]") { + BigDataTest a, b, c; + SECTION("subtracts 0 from 1") { - BigData* a; - SBigNew(&a); - - BigData* b; - SBigNew(&b); SBigFromUnsigned(b, 1); - - BigData* c; - SBigNew(&c); SBigFromUnsigned(c, 0); Sub(a->Primary(), b->Primary(), c->Primary()); @@ -1479,21 +1473,40 @@ TEST_CASE("Sub", "[big]") { CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 1); + } - SBigDel(a); - SBigDel(b); + SECTION("subtracts int 0 from bigint 1") { + SBigFromUnsigned(b, 1); + + Sub(a->Primary(), b->Primary(), 0); + + a->Primary().Trim(); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 1); + } + + SECTION("subtracts 1 from 0") { + SBigFromUnsigned(b, 0); + SBigFromUnsigned(c, 1); + + Sub(a->Primary(), b->Primary(), c->Primary()); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 0xFFFFFFFF); + } + + SECTION("subtracts int 1 from bigint 0") { + SBigFromUnsigned(b, 0); + + Sub(a->Primary(), b->Primary(), 1); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 0xFFFFFFFF); } SECTION("subtracts 1 from 2") { - BigData* a; - SBigNew(&a); - - BigData* b; - SBigNew(&b); SBigFromUnsigned(b, 2); - - BigData* c; - SBigNew(&c); SBigFromUnsigned(c, 1); Sub(a->Primary(), b->Primary(), c->Primary()); @@ -1502,22 +1515,23 @@ TEST_CASE("Sub", "[big]") { CHECK(a->Primary().Count() == 1); CHECK(a->Primary()[0] == 1); + } - SBigDel(a); - SBigDel(b); + SECTION("subtracts int 1 from bigint 2") { + SBigFromUnsigned(b, 2); + + Sub(a->Primary(), b->Primary(), 1); + + a->Primary().Trim(); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 1); } SECTION("subtracts 0x1111111111111111 from 0x9999999999999999") { - BigData* a; - SBigNew(&a); - - BigData* b; - SBigNew(&b); uint64_t b_ = 0x9999999999999999; SBigFromBinary(b, reinterpret_cast(&b_), sizeof(b_)); - BigData* c; - SBigNew(&c); uint64_t c_ = 0x1111111111111111; SBigFromBinary(c, reinterpret_cast(&c_), sizeof(c_)); @@ -1528,22 +1542,12 @@ TEST_CASE("Sub", "[big]") { CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0x88888888); CHECK(a->Primary()[1] == 0x88888888); - - SBigDel(a); - SBigDel(b); } SECTION("subtracts 0x123456789ABCDEF0 from 0xFEDCBA9876543210") { - BigData* a; - SBigNew(&a); - - BigData* b; - SBigNew(&b); uint64_t b_ = 0xFEDCBA9876543210; SBigFromBinary(b, reinterpret_cast(&b_), sizeof(b_)); - BigData* c; - SBigNew(&c); uint64_t c_ = 0x123456789ABCDEF0; SBigFromBinary(c, reinterpret_cast(&c_), sizeof(c_)); @@ -1554,8 +1558,6 @@ TEST_CASE("Sub", "[big]") { CHECK(a->Primary().Count() == 2); CHECK(a->Primary()[0] == 0xDB975320); CHECK(a->Primary()[1] == 0xECA8641F); - - SBigDel(a); - SBigDel(b); } + }