From aad7f751dddfcbb609423b2ca7bcd1395459ff69 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Tue, 31 Jan 2023 22:17:51 -0600 Subject: [PATCH] feat(big): add Add --- storm/big/Ops.cpp | 11 ++++++++ storm/big/Ops.hpp | 2 ++ test/Big.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index 4df9cb6..513c9bc 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -1,5 +1,16 @@ #include "storm/big/Ops.hpp" +void Add(BigBuffer& a, const BigBuffer& b, uint32_t c) { + uint64_t carry = c; + uint32_t i = 0; + for (i = 0; carry || b.IsUsed(i); i++) { + carry += b[i]; + a[i] = ExtractLowPart(carry); + } + + a.SetCount(i); +} + void Add(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) { uint64_t carry = 0; uint32_t i = 0; diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index 404c61b..7d67192 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -5,6 +5,8 @@ #include "storm/big/BigStack.hpp" #include +void Add(BigBuffer& a, const BigBuffer& b, uint32_t c); + void Add(BigBuffer& a, const BigBuffer& b, const BigBuffer& c); uint32_t ExtractLowPart(uint64_t& value); diff --git a/test/Big.cpp b/test/Big.cpp index 7afbbe0..6126076 100644 --- a/test/Big.cpp +++ b/test/Big.cpp @@ -2,6 +2,72 @@ #include "storm/big/Ops.hpp" #include "test/Test.hpp" +TEST_CASE("Add", "[big]") { + SECTION("adds 0 and 1") { + BigData* a; + SBigNew(&a); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 0); + + uint64_t c = 1; + + Add(a->Primary(), b->Primary(), c); + + a->Primary().Trim(); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 1); + + SBigDel(a); + SBigDel(b); + } + + SECTION("adds 2 and 4") { + BigData* a; + SBigNew(&a); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 2); + + uint64_t c = 4; + + Add(a->Primary(), b->Primary(), c); + + a->Primary().Trim(); + + CHECK(a->Primary().Count() == 1); + CHECK(a->Primary()[0] == 6); + + SBigDel(a); + SBigDel(b); + } + + SECTION("adds 0xFFFFFFFF and 0xCCCCCCCC") { + BigData* a; + SBigNew(&a); + + BigData* b; + SBigNew(&b); + SBigFromUnsigned(b, 0xFFFFFFFF); + + uint64_t c = 0xCCCCCCCC; + + Add(a->Primary(), b->Primary(), c); + + a->Primary().Trim(); + + CHECK(a->Primary().Count() == 2); + CHECK(a->Primary()[0] == 0xCCCCCCCB); + CHECK(a->Primary()[1] == 0x1); + + SBigDel(a); + SBigDel(b); + } +} + TEST_CASE("ExtractLowPart", "[big]") { SECTION("extracts low part of 0") { uint64_t value = 0;