Fixed the way interval_t objects are initialized

This commit is contained in:
John Wiegley 2009-02-14 04:27:15 -04:00
parent e50abb5645
commit 388044dec9
2 changed files with 11 additions and 13 deletions

View file

@ -118,21 +118,19 @@ date_t parse_date(const char * str, int current_year)
return gregorian::date_from_tm(when);
}
date_t interval_t::first(const optional<date_t>& moment) const
date_t interval_t::first(const optional<date_t>& moment)
{
if (! is_valid(begin))
throw_(date_error,
"Use of interval_t::first() with specifying a range start");
if (! is_valid(begin)) {
// Find an efficient starting point for the upcoming while loop. We want
// a date early enough that the range will be correct, but late enough
// that we don't spend hundreds of thousands of loops skipping through
// time.
begin = date_t(moment->year(), gregorian::Jan, 1);
}
date_t quant(begin);
if (moment && *moment > quant) {
// Find an efficient starting point for the upcoming while loop.
// We want a date early enough that the range will be correct, but
// late enough that we don't spend hundreds of thousands of loops
// skipping through time.
date_t quant(moment->year(), gregorian::Jan, 1);
if (moment && *moment >= quant) {
date_t temp;
while (*moment >= (temp = increment(quant))) {
if (quant == temp)

View file

@ -162,10 +162,10 @@ struct interval_t
}
void set_start(const date_t& moment) {
begin = moment;
begin = first(moment);
}
date_t first(const optional<date_t>& moment = none) const;
date_t first(const optional<date_t>& moment = none);
date_t increment(const date_t&) const;
void parse(std::istream& in);