#pragma once #include #include #include class number { public: number() = default; number(const number &) = default; number(number &&) = default; number &operator=(const number &) = default; number &operator=(number &&) = default; number(std::uint64_t); /** * \brief Return a hexadecimal string representation of this number. */ std::string to_hex_string() const; /** * \brief Return a decimal string representation of this number. */ std::string to_dec_string() const; /** * \brief Return a 32-bits-wide integer that corresponds to this number. * * \throws std::out_of_range The number cannot be represented by a single * 32-bits-wide integer. */ std::uint32_t to_uint32() const; /** * \brief Return a 64-bits-wide integer that corresponds to this number. * * \throws std::out_of_range The number cannot be represented by a single * 64-bits-wide integer. */ std::uint64_t to_uint64() const; /** * \brief Return true if this number is not equal to 0. Otherwise, return * false. */ explicit operator bool() const; /** * \brief Return the result of the addition of a number and this number. * * \param n The number to add to this number. */ number operator+(const number &n) const; /** * \brief Return the result of the multiplication of a number and this * number. * * \param n The number to multiply with this number. */ number operator*(const number &) const; /** * \brief Return a number equals to this number where n bits have been * shifted to the left. * * \param n Number of bits to shift. */ number operator<<(std::uint32_t n) const; /** * \brief Return a number equals to this number where n bits have been * shifted to the right. * * \param n Number of bits to shift. */ number operator>>(std::uint32_t) const; /** * \brief Tell whether the number passed as parameter is strictly less than * this number. * * \param n The number to compare with this number. */ bool operator<(const number &n) const; /** * \brief Tell whether the number passed as parameter is strictly greater * than this number. * * \param n The number to compare with this number. */ bool operator>(const number &n) const; /** * \brief Tell whether the number passed as parameter is less than or equal * to this number. * * \param n The number to compare with this number. */ bool operator<=(const number &n) const; /** * \brief Tell whether the number passed as parameter is greater than or * equal to this number. * * \param n The number to compare with this number. */ bool operator>=(const number &n) const; /** * \brief Tell whether the number passed as parameter is equal to this * number. * * \param n The number to compare with this number. */ bool operator==(const number &n) const; /** * \brief Tell whether the number passed as parameter is not equal to this * number. * * \param n The number to compare with this number. */ bool operator!=(const number &n) const; /** * \brief Tell whether this number evaluates to false. */ bool operator!() const; /** * \brief Add a number to this number. * * \param n Number to add to this number. */ number &operator+=(const number &n); /** * \brief Multiply a number with this number. * * \param n Number with multiply to this number. */ number &operator*=(const number &n); /** * \brief Shift the number n bits to the left. * * \param n Number of bits to shift. */ number &operator<<=(std::uint32_t); /** * \brief Shift the number n bits to the right. * * \param n Number of bits to shift. */ number &operator>>=(std::uint32_t); /** * \brief Increment this number. */ number &operator++(); private: /** * \brief Remove unused leading 0 operands. * * Call this method after shrinking the number so that leading 0 operands * are removed. */ void shrink_to_fit(); /* First item is the least significant. */ std::list _operands; }; std::ostream &operator<<(std::ostream &, const number &);