Never price commodities using annotated commodities

This commit is contained in:
John Wiegley 2012-03-30 00:38:29 -05:00
parent 4b2b9dc009
commit 8e8c2904f5
6 changed files with 35 additions and 24 deletions

View file

@ -757,10 +757,10 @@ amount_t::value(const datetime_t& moment,
}
}
if (! point) {
if (comm && commodity().referent() == comm->referent())
return *this;
return with_commodity(comm->referent());
if (! point) {
point = commodity().find_price(comm, moment);
// Whether a price was found or not, check whether we should attempt

View file

@ -544,6 +544,15 @@ public:
*this = 0L;
commodity_ = &comm;
}
amount_t with_commodity(const commodity_t& comm) const {
if (commodity_ == &comm) {
return *this;
} else {
amount_t tmp(*this);
tmp.set_commodity(const_cast<commodity_t&>(comm));
return tmp;
}
}
void clear_commodity() {
commodity_ = NULL;
}

View file

@ -288,7 +288,7 @@ annotated_commodity_t::find_price(const commodity_t * commodity,
return find_price_from_expr(const_cast<expr_t&>(*details.value_expr),
commodity, when);
return commodity_t::find_price(target, moment, oldest);
return commodity_t::find_price(target, when, oldest);
}
commodity_t&

View file

@ -56,14 +56,14 @@ void commodity_t::add_price(const datetime_t& date, const amount_t& price,
DEBUG("history.find", "Adding price: " << symbol()
<< " for " << price << " on " << date);
pool().commodity_price_history.add_price(*this, date, price);
pool().commodity_price_history.add_price(referent(), date, price);
base->price_map.clear(); // a price was added, invalid the map
}
void commodity_t::remove_price(const datetime_t& date, commodity_t& commodity)
{
pool().commodity_price_history.remove_price(*this, commodity, date);
pool().commodity_price_history.remove_price(referent(), commodity, date);
DEBUG("history.find", "Removing price: " << symbol() << " on " << date);
@ -83,7 +83,7 @@ void commodity_t::map_prices(function<void(datetime_t, const amount_t&)> fn,
else
when = CURRENT_TIME();
pool().commodity_price_history.map_prices(fn, *this, when, _oldest,
pool().commodity_price_history.map_prices(fn, referent(), when, _oldest,
bidirectionally);
}
@ -159,9 +159,9 @@ commodity_t::find_price(const commodity_t * commodity,
optional<price_point_t>
point(target ?
pool().commodity_price_history.find_price(*this, *target,
pool().commodity_price_history.find_price(referent(), *target,
when, oldest) :
pool().commodity_price_history.find_price(*this, when, oldest));
pool().commodity_price_history.find_price(referent(), when, oldest));
// Record this price point in the memoization map
if (base->price_map.size() > base_t::max_price_map_size) {
@ -206,7 +206,7 @@ commodity_t::check_for_updated_price(const optional<price_point_t>& point,
DEBUG("commodity.download",
"attempting to download a more current quote...");
if (optional<price_point_t> quote =
pool().get_commodity_quote(*this, in_terms_of)) {
pool().get_commodity_quote(referent(), in_terms_of)) {
if (! in_terms_of ||
(quote->price.has_commodity() &&
quote->price.commodity_ptr() == in_terms_of))
@ -220,12 +220,11 @@ commodity_t::check_for_updated_price(const optional<price_point_t>& point,
commodity_t& commodity_t::nail_down(const expr_t& expr)
{
annotation_t new_details;
new_details.value_expr = expr;
new_details.add_flags(ANNOTATION_VALUE_EXPR_CALCULATED);
commodity_t * new_comm =
commodity_pool_t::current_pool->find_or_create(symbol(), new_details);
return *new_comm;
return *pool().find_or_create(symbol(), new_details);
}
commodity_t::operator bool() const

View file

@ -188,6 +188,9 @@ public:
return comm == *this;
return base.get() == comm.base.get();
}
bool operator==(const string& name) const {
return base_symbol() == name;
}
static bool symbol_needs_quotes(const string& symbol);

View file

@ -20,24 +20,24 @@ While parsing file "src/amount.h", line 121:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 132:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 693:
While parsing file "src/amount.h", line 702:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 723:
While parsing file "src/amount.h", line 732:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 731:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 734:
Error: Invalid date/time: line amount_t amoun
While parsing file "src/amount.h", line 740:
Error: Unexpected whitespace at beginning of line
While parsing file "src/amount.h", line 743:
Error: Invalid date/time: line amount_t amoun
While parsing file "src/amount.h", line 749:
Error: Invalid date/time: line string amount_
While parsing file "src/amount.h", line 746:
While parsing file "src/amount.h", line 755:
Error: Invalid date/time: line string amount_
While parsing file "src/amount.h", line 752:
While parsing file "src/amount.h", line 761:
Error: Invalid date/time: line string amount_
While parsing file "src/amount.h", line 758:
While parsing file "src/amount.h", line 767:
Error: Invalid date/time: line std::ostream&
While parsing file "src/amount.h", line 765:
While parsing file "src/amount.h", line 774:
Error: Invalid date/time: line std::istream&
While parsing file "src/amount.h", line 771:
While parsing file "src/amount.h", line 780:
Error: Unexpected whitespace at beginning of line
end test