Boost logo

Boost :

From: Jeff Garland (jeff_at_[hidden])
Date: 2003-01-13 10:06:44


>Btw, by recurring events I mean events which can be configured to
occur
>for example: every monday and thursday, last friday in month,
>every second tuesday, every friday the 13th, and so on...
>Much like crontab or MS-Outlook's recurrence appointments.
>
>Unfortunately, there is no such class in the Date-Time library.
I don't
>know, but maybe such a class doesn't fit in a library?

I believe it would be a perfect fit with the library. The only
reason it isn't there is time. I would be happy to collaborate
with you on building such an extension :-)

>Anyhow, I think it would be really nice to say something like:
>recurring_event<daily> wakeMeUp("09:45");
>recurring_event<weekly> trainingDays(monday,thursday);
>recurring_event<weekly> cleaningDay(tuesday,every_2nd);
>recurring_event<monthly> receiveSalary(friday,last_day_in_month);
>recurring_event<yearly> santa(christmas_day);

In general, what you want to do here is very similar to the
generator concept. See

http://www.boost.org/libs/date_time/doc/date_algorithms.html

for some ideas. For example your receiveSalary on the last
friday of the month is very similar to the 'last_kday_of_month'
which performs the following calculation:

  last_kday_of_month lkm(Friday,Jan);
  date d = lkm.get_date(2002);//2002-Jan-28
  date d2 = lkm.get_date(2003); //2003-Jan-31

>Does anyone have an idea or hint how to implement such a class (maybe
>out of different boost-classes)? Otherwise I know one way to go, based
>on the paper "Recurring Events" written by Martin Fowler and available
>on his site martinfowler.com.

I believe most of the tools you need are already in the library.
It is really a matter of putting them together in a way that is
useful to your application. For example

 recurring_event<daily> wakeMeUp("09:45");

is easily specified as a time duration offset from midnight. That
is
  using namespace boost::gregorian;
  using namespace boost::posix_time;
  //warning -- untested code!
  class daily_event {
    daily_event(time_duration td) :
      offset_from_midnight(td)
    {}
    //use this to generate wakeup time for any date....
    ptime getWakeUpTime(date d)
    {
       return ptime(d, offset_from_midnight);
    }
  private:
    time_duration offset_from_midnight;
  };

Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk