#include #include #include #include "integer.h" Integer::Integer(int i) : value{positive(i)}, negative{i<0} { } Integer::operator int () const { if ( value > std::numeric_limits::max() ) { throw std::range_error{"Overflow"}; } int r = static_cast(value); return negative ? -r : r; } bool Integer::operator==(Integer const& i) const { return value == i.value && negative == i.negative; } bool Integer::operator<(Integer const& i) const { if ( same_sign(i) ) { if ( negative ) { return i.value < value; } else { return value < i.value; } } else { return negative; } } Integer& Integer::operator++() { if ( negative ) { --value; negative = (value != 0); } else { ++value; } return *this; } std::ostream& operator<<(std::ostream& os, Integer const& i) { if ( i.negative ) { os << '-'; } return os << i.value; } bool Integer::same_sign(Integer const& i) const { return negative == i.negative; } unsigned int Integer::positive(int i) const { return static_cast(i < 0 ? -i : i); }