diff options
Diffstat (limited to 'balance.cc')
-rw-r--r-- | balance.cc | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -85,4 +85,64 @@ void balance_t::write(std::ostream& out, } } +balance_t& balance_t::operator*=(const balance_t& bal) +{ + if (! *this || ! bal) { + return (*this = 0L); + } + else if (amounts.size() == 1 && bal.amounts.size() == 1) { + return *this *= (*bal.amounts.begin()).second; + } + else { + std::string msg; + std::ostringstream errmsg(msg); + errmsg << "It makes no sense to multiply two balances: " + << *this << " * " << bal; + throw amount_error(errmsg.str()); + } +} + +balance_t& balance_t::operator/=(const balance_t& bal) +{ + if (! *this) { + return (*this = 0L); + } + else if (! bal) { + std::string msg; + std::ostringstream errmsg(msg); + errmsg << "Attempt to divide by zero: " << *this << " / " << bal; + throw amount_error(errmsg.str()); + } + else if (amounts.size() == 1 && bal.amounts.size() == 1) { + return *this /= (*bal.amounts.begin()).second; + } + else if (*this == bal) { + return (*this = 1L); + } + else { + std::string msg; + std::ostringstream errmsg(msg); + errmsg << "It makes no sense to divide two balances: " + << *this << " / " << bal; + throw amount_error(errmsg.str()); + } +} + +balance_t::operator amount_t() const +{ + if (amounts.size() == 1) { + return (*amounts.begin()).second; + } + else if (amounts.size() == 0) { + return amount_t(); + } + else { + std::string msg; + std::ostringstream errmsg(msg); + errmsg << "Cannot convert a balance with " + << "multiple commodities to an amount: " << *this; + throw amount_error(errmsg.str()); + } +} + } // namespace ledger |