abacus: bignum: add output operator
This commit is contained in:
parent
0a5fb471e4
commit
ad5092ea8d
|
@ -1,6 +1,8 @@
|
|||
#include "bignum.hh"
|
||||
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
|
@ -27,6 +29,20 @@ BigNum::BigNum(std::int64_t number) {
|
|||
assert(is_canonicalized());
|
||||
}
|
||||
|
||||
std::ostream& BigNum::dump(std::ostream& out) const {
|
||||
if (sign_ == 0) {
|
||||
return out << '0';
|
||||
}
|
||||
|
||||
if (sign_ < 0) {
|
||||
out << '-';
|
||||
}
|
||||
std::copy(digits_.rbegin(), digits_.rend(),
|
||||
std::ostream_iterator<int>(out));
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
void BigNum::flip_sign() {
|
||||
assert(is_canonicalized());
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <iosfwd>
|
||||
#include <vector>
|
||||
|
||||
#include <cstdint>
|
||||
|
@ -10,6 +11,10 @@ class BigNum {
|
|||
public:
|
||||
explicit BigNum(std::int64_t number);
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& out, BigNum const& num) {
|
||||
return num.dump(out);
|
||||
}
|
||||
|
||||
friend BigNum operator+(BigNum const& rhs) {
|
||||
return rhs;
|
||||
}
|
||||
|
@ -45,6 +50,8 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
std::ostream& dump(std::ostream& out) const;
|
||||
|
||||
void flip_sign();
|
||||
|
||||
bool equal(BigNum const& rhs) const;
|
||||
|
|
|
@ -1,9 +1,29 @@
|
|||
#include <sstream>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "bignum.hh"
|
||||
|
||||
using namespace abacus::bignum;
|
||||
|
||||
TEST(BigNum, dump) {
|
||||
auto const zero = BigNum(0);
|
||||
auto const one = BigNum(1);
|
||||
auto const minus_one = BigNum(-1);
|
||||
auto const forty_two = BigNum(42);
|
||||
|
||||
auto const to_str = [](auto num) {
|
||||
std::stringstream str;
|
||||
str << num;
|
||||
return str.str();
|
||||
};
|
||||
|
||||
ASSERT_EQ(to_str(zero), "0");
|
||||
ASSERT_EQ(to_str(one), "1");
|
||||
ASSERT_EQ(to_str(minus_one), "-1");
|
||||
ASSERT_EQ(to_str(forty_two), "42");
|
||||
}
|
||||
|
||||
TEST(BigNum, equality) {
|
||||
auto const zero = BigNum(0);
|
||||
auto const one = BigNum(1);
|
||||
|
|
Loading…
Reference in a new issue