From 675319a0b01416a946407213e5c270a644adc575 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Tue, 8 Mar 2005 04:52:12 +0000 Subject: (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. --- amount.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'amount.cc') diff --git a/amount.cc b/amount.cc index 35f50b21..05421760 100644 --- a/amount.cc +++ b/amount.cc @@ -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, -- cgit v1.2.3