A split_interval_set
сохраняет все интервальные границы при вводе и пересечении операций. Таким образом, split_interval_set
и добавление интервала
x = {[1, 3)}
x.add( [2, 4))
затем интервалы делятся на их границы
x == {[1,2)[2,3)[3,4)}
Используя это свойство, мы можем пересекать split_interval_maps
, чтобы итерировать через интервалы учет всех происходящих изменений интервальных границ.
В этом примере мы обеспечиваем пересечение двух split_interval_sets
, представляющих месячную и недельную сетку времени.
#include <boost/icl/gregorian.hpp>
#include <iostream>
#include <boost/icl/split_interval_set.hpp>
using namespace std;
using namespace boost::gregorian;
using namespace boost::icl;
typedef split_interval_set<boost::gregorian::date> date_grid;
date_grid month_grid(const discrete_interval<date>& scope)
{
split_interval_set<date> month_grid;
date frame_months_1st = first(scope).end_of_month() + days(1) - months(1);
month_iterator month_iter(frame_months_1st);
for(; month_iter <= last(scope); ++month_iter)
month_grid += discrete_interval<date>::right_open(*month_iter, *month_iter + months(1));
month_grid &= scope;
return month_grid;
}
date_grid week_grid(const discrete_interval<date>& scope)
{
split_interval_set<date> week_grid;
date frame_weeks_1st = first(scope) + days(days_until_weekday(first(scope), greg_weekday(Monday))) - weeks(1);
week_iterator week_iter(frame_weeks_1st);
for(; week_iter <= last(scope); ++week_iter)
week_grid.insert(discrete_interval<date>::right_open(*week_iter, *week_iter + weeks(1)));
week_grid &= scope;
return week_grid;
}
void month_and_time_grid()
{
date someday = day_clock::local_day();
date thenday = someday + months(2);
discrete_interval<date> itv = discrete_interval<date>::right_open(someday, thenday);
date_grid month_and_week_grid = month_grid(itv);
month_and_week_grid &= week_grid(itv);
cout << "interval : " << first(itv) << " - " << last(itv)
<< " month and week partitions:" << endl;
cout << "---------------------------------------------------------------\n";
for(date_grid::iterator it = month_and_week_grid.begin();
it != month_and_week_grid.end(); it++)
{
if(first(*it).day() == 1)
cout << "new month: ";
else if(first(*it).day_of_week()==greg_weekday(Monday))
cout << "new week : " ;
else if(it == month_and_week_grid.begin())
cout << "first day: " ;
cout << first(*it) << " - " << last(*it) << endl;
}
}
int main()
{
cout << ">>Interval Container Library: Sample month_and_time_grid.cpp <<\n";
cout << "---------------------------------------------------------------\n";
month_and_time_grid();
return 0;
}