summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/filters.cc2
-rw-r--r--src/filters.h2
-rw-r--r--src/post.cc18
-rw-r--r--src/post.h41
4 files changed, 33 insertions, 30 deletions
diff --git a/src/filters.cc b/src/filters.cc
index adf8b33a..b66bafae 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -286,7 +286,7 @@ namespace {
case value_t::BALANCE:
case value_t::SEQUENCE:
- xdata.value = temp;
+ xdata.compound_value = temp;
xdata.add_flags(POST_EXT_COMPOUND);
break;
diff --git a/src/filters.h b/src/filters.h
index 68df6e06..eb93e50a 100644
--- a/src/filters.h
+++ b/src/filters.h
@@ -99,7 +99,7 @@ public:
}
virtual void operator()(post_t& post) {
- post.xdata().value = post.amount.unrounded();
+ post.xdata().compound_value = post.amount.unrounded();
post.xdata().add_flags(POST_EXT_COMPOUND);
item_handler<post_t>::operator()(post);
}
diff --git a/src/post.cc b/src/post.cc
index 4289433e..98899946 100644
--- a/src/post.cc
+++ b/src/post.cc
@@ -140,12 +140,10 @@ namespace {
}
value_t get_amount(post_t& post) {
- if (post.has_xdata() &&
- post.xdata().has_flags(POST_EXT_COMPOUND)) {
- return post.xdata().value;
- } else {
+ if (post.has_xdata() && post.xdata().has_flags(POST_EXT_COMPOUND))
+ return post.xdata().compound_value;
+ else
return post.amount;
- }
}
value_t get_use_direct_amount(post_t& post) {
@@ -169,7 +167,7 @@ namespace {
return *post.cost;
else if (post.has_xdata() &&
post.xdata().has_flags(POST_EXT_COMPOUND))
- return post.xdata().value;
+ return post.xdata().compound_value;
else
return post.amount;
}
@@ -365,13 +363,13 @@ bool post_t::valid() const
return true;
}
-void post_t::add_to_value(value_t& value, expr_t& expr)
+void post_t::add_to_value(value_t& value, const optional<expr_t&>& expr) const
{
if (xdata_ && xdata_->has_flags(POST_EXT_COMPOUND)) {
- add_or_set_value(value, xdata_->value);
+ add_or_set_value(value, xdata_->compound_value);
} else {
- bind_scope_t bound_scope(*expr.get_context(), *this);
- add_or_set_value(value, expr.calc(bound_scope));
+ bind_scope_t bound_scope(*expr->get_context(), const_cast<post_t&>(*this));
+ add_or_set_value(value, expr->calc(bound_scope));
}
}
diff --git a/src/post.h b/src/post.h
index 175b6cbb..dc062164 100644
--- a/src/post.h
+++ b/src/post.h
@@ -53,9 +53,6 @@ namespace ledger {
class xact_t;
class account_t;
-class post_t;
-typedef std::list<post_t *> posts_list;
-
/**
* @brief Brief
*
@@ -126,20 +123,22 @@ public:
bool valid() const;
- struct xdata_t : public supports_flags<>
+ struct xdata_t : public supports_flags<uint_least16_t>
{
-#define POST_EXT_RECEIVED 0x01
-#define POST_EXT_HANDLED 0x02
-#define POST_EXT_TO_DISPLAY 0x04
-#define POST_EXT_DISPLAYED 0x08
-#define POST_EXT_DIRECT_AMT 0x10
-#define POST_EXT_SORT_CALC 0x20
-#define POST_EXT_COMPOUND 0x40
-#define POST_EXT_MATCHES 0x80
-
+#define POST_EXT_RECEIVED 0x0001
+#define POST_EXT_HANDLED 0x0002
+#define POST_EXT_DISPLAYED 0x0004
+#define POST_EXT_DIRECT_AMT 0x0008
+#define POST_EXT_SORT_CALC 0x0010
+#define POST_EXT_COMPOUND 0x0020
+#define POST_EXT_VISITED 0x0040
+#define POST_EXT_MATCHES 0x0080
+#define POST_EXT_CONSIDERED 0x0100
+
+ value_t visited_value;
+ value_t compound_value;
value_t total;
std::size_t count;
- value_t value;
date_t date;
account_t * account;
void * ptr;
@@ -147,14 +146,16 @@ public:
std::list<sort_value_t> sort_values;
xdata_t()
- : supports_flags<>(), count(0), account(NULL), ptr(NULL) {
+ : supports_flags<uint_least16_t>(), count(0),
+ account(NULL), ptr(NULL) {
TRACE_CTOR(post_t::xdata_t, "");
}
xdata_t(const xdata_t& other)
- : supports_flags<>(other.flags()),
+ : supports_flags<uint_least16_t>(other.flags()),
+ visited_value(other.visited_value),
+ compound_value(other.compound_value),
total(other.total),
count(other.count),
- value(other.value),
date(other.date),
account(other.account),
ptr(NULL),
@@ -184,8 +185,12 @@ public:
xdata_ = xdata_t();
return *xdata_;
}
+ const xdata_t& xdata() const {
+ return const_cast<post_t *>(this)->xdata();
+ }
- void add_to_value(value_t& value, expr_t& expr);
+ void add_to_value(value_t& value,
+ const optional<expr_t&>& expr = none) const;
account_t * reported_account() {
if (xdata_)