(value): Use `std::map<>::lower_bound' to search for the nearest price

item in a commodity's history list.  This is much more efficient than
doing a reverse linear search.
This commit is contained in:
John Wiegley 2005-03-08 04:52:12 +00:00
parent 6a1071b289
commit 675319a0b0

View file

@ -1173,15 +1173,20 @@ amount_t commodity_t::value(const std::time_t moment)
std::time_t age = 0;
amount_t price;
if (history)
for (history_map::reverse_iterator i = history->prices.rbegin();
i != history->prices.rend();
i++)
if (moment == 0 || std::difftime(moment, (*i).first) >= 0) {
if (history) {
if (moment == 0) {
history_map::reverse_iterator i = history->prices.rbegin();
age = (*i).first;
price = (*i).second;
} else {
history_map::iterator i = history->prices.lower_bound(moment);
if (i != history->prices.begin()) {
--i;
age = (*i).first;
price = (*i).second;
break;
}
}
}
if (updater)
(*updater)(*this, moment, age,