summaryrefslogtreecommitdiff
path: root/value.cc
diff options
context:
space:
mode:
Diffstat (limited to 'value.cc')
-rw-r--r--value.cc51
1 files changed, 38 insertions, 13 deletions
diff --git a/value.cc b/value.cc
index 8edffe80..377a9631 100644
--- a/value.cc
+++ b/value.cc
@@ -728,15 +728,16 @@ value_t value_t::price() const
switch (type) {
case BOOLEAN:
case INTEGER:
+ return *this;
+
case AMOUNT:
+ return ((amount_t *) data)->price();
+
case BALANCE:
- return *this;
+ return ((balance_t *) data)->price();
case BALANCE_PAIR:
- if (((balance_pair_t *) data)->price)
- return *(((balance_pair_t *) data)->price);
- else
- return 0L;
+ return ((balance_pair_t *) data)->quantity.price();
default:
assert(0);
@@ -746,6 +747,31 @@ value_t value_t::price() const
return value_t();
}
+value_t value_t::reduce(const bool keep_price, const bool keep_date,
+ const bool keep_tag) const
+{
+ switch (type) {
+ case BOOLEAN:
+ case INTEGER:
+ return *this;
+
+ case AMOUNT:
+ return ((amount_t *) data)->reduce_commodity(keep_price, keep_date,
+ keep_tag);
+ case BALANCE:
+ return ((balance_t *) data)->reduce(keep_price, keep_date, keep_tag);
+
+ case BALANCE_PAIR:
+ return ((balance_pair_t *) data)->quantity.reduce(keep_price, keep_date,
+ keep_tag);
+ default:
+ assert(0);
+ break;
+ }
+ assert(0);
+ return value_t();
+}
+
value_t value_t::cost() const
{
switch (type) {
@@ -770,22 +796,21 @@ value_t value_t::cost() const
return value_t();
}
-value_t& value_t::add(const amount_t& amount,
- const amount_t * price, const amount_t * cost)
+value_t& value_t::add(const amount_t& amount, const amount_t * cost)
{
switch (type) {
case BOOLEAN:
case INTEGER:
case AMOUNT:
- if (price || cost) {
+ if (cost) {
cast(BALANCE_PAIR);
- return add(amount, price, cost);
+ return add(amount, cost);
}
else if ((type == AMOUNT &&
((amount_t *) data)->commodity() != amount.commodity()) ||
(type != AMOUNT && amount.commodity())) {
cast(BALANCE);
- return add(amount, price, cost);
+ return add(amount, cost);
}
else if (type != AMOUNT) {
cast(AMOUNT);
@@ -794,15 +819,15 @@ value_t& value_t::add(const amount_t& amount,
break;
case BALANCE:
- if (price || cost) {
+ if (cost) {
cast(BALANCE_PAIR);
- return add(amount, price, cost);
+ return add(amount, cost);
}
*((balance_t *) data) += amount;
break;
case BALANCE_PAIR:
- ((balance_pair_t *) data)->add(amount, price, cost);
+ ((balance_pair_t *) data)->add(amount, cost);
break;
default: