X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Farbint.h;h=1507ba7a4e90d003330c81c1d9e07ec4e1a50da8;hp=d90a43b1d72a8ea66785fa5627f4127a065dd17d;hb=ee5287fabfb214e8f7b483cde424108270525fd7;hpb=35e78b378435e37ffdb6e53a97f6fa0998999f67 diff --git a/src/arbint.h b/src/arbint.h index d90a43b..1507ba7 100644 --- a/src/arbint.h +++ b/src/arbint.h @@ -1,26 +1,78 @@ #ifndef _ARBINT_H #define _ARBINT_H -#include +#include "common.h" namespace IPDF { class Arbint { public: - Arbint(int64_t i); + typedef int64_t digit_t; + + Arbint(digit_t i); + Arbint(unsigned n, digit_t d0, ...); + Arbint(const std::string & str, const std::string & base="0123456789"); ~Arbint() {} Arbint(const Arbint & cpy); + + + inline bool Sign() const {return m_sign;} + inline char SignChar() const {return (m_sign) ? '-' : '+';} + std::string DigitStr() const; - std::string Str() const; - + std::string Str(const std::string & base="0123456789") const; + inline std::string Str(const char * base) const + { + return Str(std::string(base)); + } + + Arbint & operator=(const Arbint & equ); + Arbint & operator+=(const Arbint & add); + Arbint & operator-=(const Arbint & sub); + + + bool operator==(const Arbint & equ) const; + + + inline Arbint operator+(const Arbint & add) const + { + Arbint a(*this); + a += add; + return a; + } + inline Arbint operator-(const Arbint & add) const + { + Arbint a(*this); + a -= add; + return a; + } + inline bool operator!=(const Arbint & equ) const + { + return !this->operator==(equ); + } + + unsigned Shrink(); private: - std::vector m_words; + + Arbint & AddBasic(const Arbint & add); + Arbint & SubBasic(const Arbint & sub); + + std::vector m_digits; bool m_sign; + void Zero(); + }; + +extern "C" +{ + typedef int64_t digit_t; + digit_t add_digits(digit_t * dst, digit_t * add, digit_t size); + digit_t sub_digits(digit_t * dst, digit_t * add, digit_t size); } +} #endif //_ARBINT_H