// // biginteger.h // bigdecimal // // Created by Sam Jaffe on 6/30/17. // #pragma once #include #include #include "number_format.h" namespace math { class biginteger { private: template using is_signed_t = typename std::enable_if::is_integer && std::numeric_limits::is_signed, int>::type; template using is_unsigned_t = typename std::enable_if::is_integer && !std::numeric_limits::is_signed, int>::type; public: using data_type = std::vector; static biginteger const ZERO, ONE, NEGATIVE_ONE; static constexpr int32_t const MAX_SEG{999999999}; static constexpr int32_t const OVER_SEG{1000000000}; static constexpr int32_t const SEG_DIGITS{9}; public: // Constructors biginteger(); template biginteger(Int value, is_signed_t = 0) : biginteger(value < 0, static_cast(value < 0 ? -value : value)) {} template biginteger(Int value, is_unsigned_t = 0) : biginteger(false, static_cast(value)) {} biginteger(char const *); // Unary operators biginteger operator-() const; // Binary operators friend biginteger operator+(biginteger, biginteger const &); friend biginteger operator-(biginteger, biginteger const &); friend biginteger operator*(biginteger, biginteger const &); friend biginteger operator/(biginteger, biginteger const &); friend biginteger operator%(biginteger, biginteger const &); friend biginteger & operator+=(biginteger &, biginteger const &); friend biginteger & operator-=(biginteger &, biginteger const &); friend biginteger & operator*=(biginteger &, biginteger const &); friend biginteger & operator/=(biginteger &, biginteger const &); // Output std::string to_string(number_format const & fmt = default_fmt) const; // Comparison friend bool operator==(biginteger const &, biginteger const &); friend bool operator!=(biginteger const &, biginteger const &); friend bool operator<=(biginteger const &, biginteger const &); friend bool operator<(biginteger const &, biginteger const &); friend bool operator>=(biginteger const &, biginteger const &); friend bool operator>(biginteger const &, biginteger const &); private: biginteger(bool, uint64_t); void subtract_impl(biginteger const & lhs, bool is_sub); friend void swap(biginteger & rhs, biginteger & lhs) { using std::swap; swap(rhs.is_negative, lhs.is_negative); swap(rhs.data, lhs.data); } bool is_negative; data_type data{}; }; }