diff options
author | John Wiegley <johnw@newartisans.com> | 2006-02-28 10:24:21 +0000 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2008-04-13 05:48:43 -0400 |
commit | 6d529efa63f5f2020b126c8476fe0ea03516869d (patch) | |
tree | c8699424992378dbd5e787f5ffc9ea5942edaa17 | |
parent | 72e8a366a49451bd46a10d0b04c16b9ff5aba354 (diff) | |
download | fork-ledger-6d529efa63f5f2020b126c8476fe0ea03516869d.tar.gz fork-ledger-6d529efa63f5f2020b126c8476fe0ea03516869d.tar.bz2 fork-ledger-6d529efa63f5f2020b126c8476fe0ea03516869d.zip |
*** no comment ***
-rw-r--r-- | balance.cc | 60 | ||||
-rw-r--r-- | balance.h | 29 | ||||
-rw-r--r-- | config.cc | 2 |
3 files changed, 68 insertions, 23 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 @@ -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 @@ -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"; } } |