diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index 513c9bc..5b399ff 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -22,6 +22,18 @@ void Add(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) { a.SetCount(i); } +int32_t Compare(const BigBuffer& a, const BigBuffer& b) { + int32_t result = 0; + + for (int32_t i = 0; a.IsUsed(i) || b.IsUsed(i); i++) { + if (a[i] != b[i]) { + result = b[i] < a[i] ? 1 : -1; + } + } + + return result; +} + uint32_t ExtractLowPart(uint64_t& value) { auto low = static_cast(value); value >>= 32; diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index 7d67192..7eab1a9 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -9,6 +9,8 @@ void Add(BigBuffer& a, const BigBuffer& b, uint32_t c); void Add(BigBuffer& a, const BigBuffer& b, const BigBuffer& c); +int32_t Compare(const BigBuffer& a, const BigBuffer& b); + uint32_t ExtractLowPart(uint64_t& value); uint32_t ExtractLowPartSx(uint64_t& value); diff --git a/test/Big.cpp b/test/Big.cpp index 6126076..fa55528 100644 --- a/test/Big.cpp +++ b/test/Big.cpp @@ -68,6 +68,86 @@ TEST_CASE("Add", "[big]") { } } +TEST_CASE("Compare", "[big]") { + SECTION("compares 0 and 1") { + BigData* a; + SBigNew(&a); + SBigFromUnsigned(a, 0); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 1); + + CHECK(Compare(a->Primary(), b->Primary()) == -1); + + SBigDel(a); + SBigDel(b); + } + + SECTION("compares 1 and 1") { + BigData* a; + SBigNew(&a); + SBigFromUnsigned(a, 1); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 1); + + CHECK(Compare(a->Primary(), b->Primary()) == 0); + + SBigDel(a); + SBigDel(b); + } + + SECTION("compares 10 and 1") { + BigData* a; + SBigNew(&a); + SBigFromUnsigned(a, 10); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 1); + + CHECK(Compare(a->Primary(), b->Primary()) == 1); + + SBigDel(a); + SBigDel(b); + } + + SECTION("compares 0x1111111111111111 and 0x22222222") { + BigData* a; + SBigNew(&a); + uint64_t data = 0x1111111111111111; + SBigFromBinary(a, reinterpret_cast(&data), sizeof(data)); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 0x22222222); + + CHECK(Compare(a->Primary(), b->Primary()) == 1); + + SBigDel(a); + SBigDel(b); + } + + SECTION("compares 0x11111111 and 0x2222222222222222") { + BigData* a; + SBigNew(&a); + SBigFromUnsigned(a, 0x11111111); + + BigData* b; + SBigNew(&b); + uint64_t data = 0x2222222222222222; + SBigFromBinary(b, reinterpret_cast(&data), sizeof(data)); + + CHECK(Compare(a->Primary(), b->Primary()) == -1); + + SBigDel(a); + SBigDel(b); + } +} + + TEST_CASE("ExtractLowPart", "[big]") { SECTION("extracts low part of 0") { uint64_t value = 0;