X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Farbint.cpp;h=59e22523c51b9d612626dc5f9f59833f8195b00b;hp=c24eb8b3ce31e31d50a307b42eba0756046294b3;hb=c64ec8fda6d6ad1bb5bdc5f2edd7d1d47c2d2680;hpb=39599aa6423d3e0181fbfe2aac8f78f388a3f372 diff --git a/src/arbint.cpp b/src/arbint.cpp index c24eb8b..59e2252 100644 --- a/src/arbint.cpp +++ b/src/arbint.cpp @@ -17,10 +17,20 @@ #include #include +#include "rational.h" + using namespace std; namespace IPDF { + +/** Absolute value hackery **/ +template <> Arbint Tabs(const Arbint & a) +{ + //Debug("Called"); + return a.Abs(); +} + Arbint::Arbint(int64_t i) : m_digits(1), m_sign(i < 0) { @@ -52,20 +62,14 @@ Arbint::Arbint(const vector & digits) : m_digits(digits), m_sign(false) Arbint & Arbint::operator=(const Arbint & cpy) { - memmove(m_digits.data(), cpy.m_digits.data(), - sizeof(digit_t)*min(m_digits.size(), cpy.m_digits.size())); - if (cpy.m_digits.size() > m_digits.size()) - { - unsigned old_size = m_digits.size(); - m_digits.resize(cpy.m_digits.size()); - memset(m_digits.data()+old_size, 0, sizeof(digit_t)*m_digits.size()-old_size); - } + m_digits = cpy.m_digits; + m_sign = cpy.m_sign; return *this; } void Arbint::Zero() { - memset(m_digits.data(), 0, sizeof(digit_t)*m_digits.size()); + m_digits.resize(1, 0L); } unsigned Arbint::Shrink() @@ -325,7 +329,7 @@ Arbint & Arbint::operator<<=(unsigned amount) bool Arbint::GetBit(unsigned i) const { unsigned digit = i/(8*sizeof(digit_t)); - if (digit > m_digits.size()) + if (digit >= m_digits.size()) return false; i = i % (8*sizeof(digit_t)); @@ -337,7 +341,7 @@ bool Arbint::GetBit(unsigned i) const void Arbint::BitClear(unsigned i) { unsigned digit = i/(8*sizeof(digit_t)); - if (digit > m_digits.size()) + if (digit >= m_digits.size()) return; i = i % (8*sizeof(digit_t)); m_digits[digit] &= ~(1L << i); @@ -346,7 +350,7 @@ void Arbint::BitClear(unsigned i) void Arbint::BitSet(unsigned i) { unsigned digit = i/(8*sizeof(digit_t)); - if (digit > m_digits.size()) + if (digit >= m_digits.size()) { m_digits.resize(digit+1, 0L); }