Added a `terminus' global, which if set marks the "current time" as

seen by the value expression logic.  This has the effect of changing
valexprs that test against the current time, such as for calculating
the market value of commodities.
This commit is contained in:
John Wiegley 2005-10-28 07:20:34 +00:00
parent 83cc662b85
commit 00fe8bc815
3 changed files with 12 additions and 3 deletions

View file

@ -3,6 +3,7 @@
#include "option.h"
#include "datetime.h"
#include "quotes.h"
#include "valexpr.h"
#include "walk.h"
#ifdef USE_BOOST_PYTHON
#include "py_eval.h"
@ -647,6 +648,8 @@ OPT_BEGIN(end, "e:") {
config.predicate += "d<[";
config.predicate += buf;
config.predicate += "]";
terminus = interval.end;
} OPT_END(end);
OPT_BEGIN(current, "c") {
@ -811,6 +814,8 @@ OPT_BEGIN(period, "p:") {
config.predicate += "d<[";
config.predicate += buf;
config.predicate += "]";
terminus = interval.end;
}
} OPT_END(period);

View file

@ -13,6 +13,8 @@ namespace ledger {
std::auto_ptr<value_expr_t> amount_expr;
std::auto_ptr<value_expr_t> total_expr;
std::time_t terminus = now;
void value_expr_t::compute(value_t& result, const details_t& details) const
{
switch (kind) {
@ -112,7 +114,7 @@ void value_expr_t::compute(value_t& result, const details_t& details) const
else if (details.entry)
result = long(details.entry->date());
else
result = long(now);
result = long(terminus);
break;
case CLEARED:
if (details.xact)
@ -286,7 +288,7 @@ void value_expr_t::compute(value_t& result, const details_t& details) const
assert(left);
left->compute(result, details);
std::time_t moment = now;
std::time_t moment = terminus;
if (right) {
switch (right->kind) {
case DATE:
@ -453,7 +455,7 @@ value_expr_t * parse_value_term(std::istream& in)
// Basic terms
case 'm':
node.reset(new value_expr_t(value_expr_t::CONSTANT_T));
node->constant_t = now;
node->constant_t = terminus;
break;
case 'a': node.reset(new value_expr_t(value_expr_t::AMOUNT)); break;

View file

@ -127,6 +127,8 @@ struct value_expr_t
extern std::auto_ptr<value_expr_t> amount_expr;
extern std::auto_ptr<value_expr_t> total_expr;
extern std::time_t terminus;
inline void compute_amount(value_t& result, const details_t& details) {
if (amount_expr.get())
amount_expr->compute(result, details);