mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 10:32:29 +00:00
feat(big): add SBigDiv
This commit is contained in:
parent
149a739a9d
commit
328bbf61d8
4 changed files with 80 additions and 5 deletions
|
|
@ -44,6 +44,15 @@ void SBigDel(BigData* num) {
|
||||||
delete num;
|
delete num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SBigDiv(BigData* a, BigData* b, BigData* c) {
|
||||||
|
uint32_t allocCount = 0;
|
||||||
|
BigBuffer &buf = a->Stack().Alloc(&allocCount);
|
||||||
|
|
||||||
|
Div(a->Primary(), buf, b->Primary(), c->Primary(), a->Stack());
|
||||||
|
|
||||||
|
a->Stack().Free(allocCount);
|
||||||
|
}
|
||||||
|
|
||||||
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes) {
|
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes) {
|
||||||
FromBinary(num->Primary(), data, bytes);
|
FromBinary(num->Primary(), data, bytes);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ void SBigDec(BigData* a, BigData* b);
|
||||||
|
|
||||||
void SBigDel(BigData* num);
|
void SBigDel(BigData* num);
|
||||||
|
|
||||||
|
void SBigDiv(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
||||||
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes);
|
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes);
|
||||||
|
|
||||||
void SBigFromStr(BigData* num, const char* str);
|
void SBigFromStr(BigData* num, const char* str);
|
||||||
|
|
|
||||||
|
|
@ -409,7 +409,7 @@ void Sub(BigBuffer& a, const BigBuffer& b, uint32_t c) {
|
||||||
|
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
for (; b.IsUsed(i); i++) {
|
for (; b.IsUsed(i); i++) {
|
||||||
borrow += b[i] - static_cast<uint64_t>(c);;
|
borrow += b[i] - c;
|
||||||
a[i] = ExtractLowPartSx(borrow);
|
a[i] = ExtractLowPartSx(borrow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
72
test/Big.cpp
72
test/Big.cpp
|
|
@ -1,5 +1,6 @@
|
||||||
#include "storm/Big.hpp"
|
#include "storm/Big.hpp"
|
||||||
#include "test/Test.hpp"
|
#include "test/Test.hpp"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
TEST_CASE("SBigAdd", "[big]") {
|
TEST_CASE("SBigAdd", "[big]") {
|
||||||
SECTION("adds 0 and 1") {
|
SECTION("adds 0 and 1") {
|
||||||
|
|
@ -214,8 +215,7 @@ TEST_CASE("SBigCompare", "[big]") {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("SBigCopy", "[big]") {
|
TEST_CASE("SBigCopy", "[big]") {
|
||||||
BigDataTest a;
|
BigDataTest a, b;
|
||||||
BigDataTest b;
|
|
||||||
|
|
||||||
SECTION("copies data") {
|
SECTION("copies data") {
|
||||||
uint8_t num[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };
|
uint8_t num[] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };
|
||||||
|
|
@ -232,8 +232,7 @@ TEST_CASE("SBigCopy", "[big]") {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("SBigDec", "[big]") {
|
TEST_CASE("SBigDec", "[big]") {
|
||||||
BigDataTest a;
|
BigDataTest a, b;
|
||||||
BigDataTest b;
|
|
||||||
|
|
||||||
SECTION("decrements value by 1") {
|
SECTION("decrements value by 1") {
|
||||||
SBigFromUnsigned(b, 5);
|
SBigFromUnsigned(b, 5);
|
||||||
|
|
@ -254,6 +253,71 @@ TEST_CASE("SBigDec", "[big]") {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SBigDiv", "[big]") {
|
||||||
|
BigDataTest a, b, c;
|
||||||
|
|
||||||
|
SECTION("divides 2 by 1") {
|
||||||
|
SBigFromUnsigned(b, 2);
|
||||||
|
SBigFromUnsigned(c, 1);
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("divides 5 by 2") {
|
||||||
|
SBigFromUnsigned(b, 5);
|
||||||
|
SBigFromUnsigned(c, 2);
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("divides 7 by 4") {
|
||||||
|
SBigFromUnsigned(b, 7);
|
||||||
|
SBigFromUnsigned(c, 4);
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("divides 0x9999444488885555 by 0x2222") {
|
||||||
|
SBigFromStr(b, std::to_string(0x9999444488885555ULL).c_str());
|
||||||
|
SBigFromUnsigned(c, 0x2222);
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 2);
|
||||||
|
CHECK(a->Primary()[0] == 0x00040002);
|
||||||
|
CHECK(a->Primary()[1] == 0x48002);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("divides 0x9999444488885555 by 0xFFFFFFFF") {
|
||||||
|
SBigFromStr(b, std::to_string(0x9999444488885555ULL).c_str());
|
||||||
|
SBigFromUnsigned(c, 0xFFFFFFFF);
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == 0x99994445);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("divides 0x9999444488885555 by 0x1111222233334444 (buffer divisor)") {
|
||||||
|
SBigFromStr(b, std::to_string(0x9999444488885555ULL).c_str());
|
||||||
|
SBigFromStr(c, std::to_string(0x1111222233334444ULL).c_str());
|
||||||
|
|
||||||
|
SBigDiv(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE("SBigFromBinary", "[big]") {
|
TEST_CASE("SBigFromBinary", "[big]") {
|
||||||
SECTION("creates bigdata from 0") {
|
SECTION("creates bigdata from 0") {
|
||||||
BigData* num;
|
BigData* num;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue