This repository has been archived on 2025-02-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Pivot/src/BigInt.cpp
2024-05-11 19:44:32 +02:00

86 lines
1.8 KiB
C++

#include "BigInt.h"
#include <cassert>
BigInt::~BigInt() {
mpz_clear(m_Data);
}
BigInt::BigInt(BigInt&& a_Move) {
std::swap(m_Data, a_Move.m_Data);
}
BigInt::BigInt(std::string&& a_Number) {
mpz_init_set_str(m_Data, a_Number.c_str(), 10);
}
BigInt::BigInt(long a_Number) {
mpz_init_set_si(m_Data, a_Number);
}
BigInt::BigInt(const BigInt& a_Copy) {
mpz_init_set(m_Data, a_Copy.m_Data);
}
void BigInt::operator=(const BigInt& a_Other) {
mpz_init_set(m_Data, a_Other.m_Data);
}
BigInt BigInt::operator+(const BigInt& a_Other) {
BigInt result = *this;
result += a_Other;
return result;
}
BigInt BigInt::operator-(const BigInt& a_Other) {
BigInt result = *this;
result -= a_Other;
return result;
}
BigInt BigInt::operator*(const BigInt& a_Other) {
BigInt result = *this;
result *= a_Other;
return result;
}
BigInt BigInt::operator/(const BigInt& a_Other) {
BigInt result = *this;
result /= a_Other;
return result;
}
BigInt BigInt::operator+=(const BigInt& a_Other) {
mpz_add(m_Data, m_Data, a_Other.m_Data);
return *this;
}
BigInt BigInt::operator-=(const BigInt& a_Other) {
mpz_sub(m_Data, m_Data, a_Other.m_Data);
return *this;
}
BigInt BigInt::operator*=(const BigInt& a_Other) {
mpz_mul(m_Data, m_Data, a_Other.m_Data);
return *this;
}
BigInt BigInt::operator/=(const BigInt& a_Other) {
mpz_divexact(m_Data, m_Data, a_Other.m_Data);
return *this;
}
bool BigInt::operator==(const BigInt& a_Other) {
return mpz_cmp(m_Data, a_Other.m_Data) == 0;
}
const std::string BigInt::ToString() const {
std::string result;
result.reserve(mpz_sizeinbase(m_Data, 10) + 2);
mpz_get_str(result.data(), 10, m_Data);
return result.c_str();
}
bool BigInt::IsEqualZero() const {
return mpz_cmp_si(m_Data, 0) == 0;
}