From 6d529efa63f5f2020b126c8476fe0ea03516869d Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Tue, 28 Feb 2006 10:24:21 +0000 Subject: *** no comment *** --- balance.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ balance.h | 29 ++++++----------------------- config.cc | 2 ++ 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/balance.cc b/balance.cc index 6305eb95..604d9d82 100644 --- a/balance.cc +++ b/balance.cc @@ -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 diff --git a/balance.h b/balance.h index 8a6e4a35..4c2c8b00 100644 --- a/balance.h +++ b/balance.h @@ -143,11 +143,7 @@ class balance_t } // multiplication and divide - balance_t& operator*=(const balance_t& bal) { - if (amounts.size() == 1 && bal.amounts.size() == 1) - return *this *= (*bal.amounts.begin()).second; - throw amount_error("It makes no sense to multiply two balances"); - } + balance_t& operator*=(const balance_t& bal); balance_t& operator*=(const amount_t& amt) { // Multiplying by the null commodity causes all amounts to be // increased by the same factor. @@ -172,11 +168,7 @@ class balance_t return *this *= amount_t(val); } - balance_t& operator/=(const balance_t& bal) { - if (amounts.size() == 1 && bal.amounts.size() == 1) - return *this /= (*bal.amounts.begin()).second; - throw amount_error("It makes no sense to divide two balances"); - } + balance_t& operator/=(const balance_t& bal); balance_t& operator/=(const amount_t& amt) { // Dividing by the null commodity causes all amounts to be // increased by the same factor. @@ -406,15 +398,7 @@ class balance_t } // conversion operators - operator amount_t() const { - if (amounts.size() == 1) - return (*amounts.begin()).second; - else if (amounts.size() == 0) - return amount_t(); - else - throw amount_error("Cannot convert a balance with " - "multiple commodities to an amount"); - } + operator amount_t() const; operator bool() const { for (amounts_map::const_iterator i = amounts.begin(); i != amounts.end(); @@ -427,9 +411,8 @@ class balance_t amount_t amount(const commodity_t& commodity) const; balance_t value(const std::time_t moment) const; - void write(std::ostream& out, - const int first_width, - const int latter_width = -1) const; + void write(std::ostream& out, const int first_width, + const int latter_width = -1) const; void abs() { for (amounts_map::iterator i = amounts.begin(); @@ -462,7 +445,7 @@ inline std::ostream& operator<<(std::ostream& out, const balance_t& bal) { class balance_pair_t { public: - balance_t quantity; + balance_t quantity; balance_t * cost; // constructors diff --git a/config.cc b/config.cc index f8ff83cf..3097ee48 100644 --- a/config.cc +++ b/config.cc @@ -143,6 +143,8 @@ config_t::regexps_to_predicate(const std::string& command, display_predicate += ")/"; } else if (! show_empty) { + if (! display_predicate.empty()) + display_predicate += "&"; display_predicate += "T"; } } -- cgit v1.2.3