110 lines
4.0 KiB
C++
110 lines
4.0 KiB
C++
|
/*-----------------------------------------------------------------------------+
|
||
|
Interval Container Library
|
||
|
Author: Joachim Faulhaber
|
||
|
Copyright (c) 2007-2010: Joachim Faulhaber
|
||
|
Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
|
||
|
+------------------------------------------------------------------------------+
|
||
|
Distributed under the Boost Software License, Version 1.0.
|
||
|
(See accompanying file LICENCE.txt or copy at
|
||
|
http://www.boost.org/LICENSE_1_0.txt)
|
||
|
+-----------------------------------------------------------------------------*/
|
||
|
#include <iostream>
|
||
|
#include <boost/icl/interval_map.hpp>
|
||
|
#include "../toytime.hpp"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace boost::icl;
|
||
|
|
||
|
/**
|
||
|
Party.cpp demonstrates the possibilities of an interval map (interval_map or
|
||
|
split_interval_map). An interval_map maps intervals to a given content. In
|
||
|
this case the content is a set of party guests represented by their name
|
||
|
strings.
|
||
|
|
||
|
As time goes by, groups of people join the party and leave later in the
|
||
|
evening. So we add a time interval and a name set to the interval_map for
|
||
|
the attendance of each group of people, that come together and leave
|
||
|
together.
|
||
|
|
||
|
On every overlap of intervals, the corresponding name sets are accumulated.
|
||
|
At the points of overlap the intervals are split. The accumulation of content
|
||
|
on overlap of intervals is always done via an operator += that has to be
|
||
|
implemented for the content parameter of the interval_map.
|
||
|
|
||
|
Finally the interval_map contains the history of attendance and all points
|
||
|
in time, where the group of party guests changed.
|
||
|
|
||
|
Party.cpp demonstrates a principle that we call aggregate on overlap
|
||
|
(aggovering;) On insertion a value associated to the interval is aggregated
|
||
|
(added) to those values in the interval_map that overlap with the inserted
|
||
|
value.
|
||
|
|
||
|
There are two behavioral aspects to aggovering: a decompositional behavior
|
||
|
and a accumulative behavior.
|
||
|
|
||
|
The decompositional behavior splits up intervals on the time dimension of
|
||
|
the interval_map so that the intervals change whenever associated values
|
||
|
change.
|
||
|
|
||
|
The accumulative behavior accumulates associated values on every overlap of
|
||
|
an insertion for the associated values.
|
||
|
*/
|
||
|
|
||
|
// Type set<string> collects the names of party guests. Since std::set is
|
||
|
// a model of the itl's set concept, the concept provides an operator +=
|
||
|
// that performs a set union on overlap of intervals.
|
||
|
typedef std::set<string> GuestSetT;
|
||
|
|
||
|
// 'Time' is the domain type the interval_map. It's key values are therefore
|
||
|
// time intervals. The content is the set of names: GuestSetT.
|
||
|
|
||
|
|
||
|
void party()
|
||
|
{
|
||
|
GuestSetT mary_harry;
|
||
|
mary_harry.insert("Mary");
|
||
|
mary_harry.insert("Harry");
|
||
|
|
||
|
GuestSetT diana_susan;
|
||
|
diana_susan.insert("Diana");
|
||
|
diana_susan.insert("Susan");
|
||
|
|
||
|
GuestSetT peter;
|
||
|
peter.insert("Peter");
|
||
|
|
||
|
interval_map<Time, GuestSetT> party;
|
||
|
|
||
|
party += make_pair( interval<Time>::right_open(Time(19,30), Time(23,00)), mary_harry);
|
||
|
party += make_pair( interval<Time>::right_open(Time(20,10), Time(monday,0,0)), diana_susan);
|
||
|
party += make_pair( interval<Time>::right_open(Time(22,15), Time(monday,0,30)), peter);
|
||
|
|
||
|
interval_map<Time, GuestSetT>::iterator it = party.begin();
|
||
|
while(it != party.end())
|
||
|
{
|
||
|
discrete_interval<Time> when = it->first;
|
||
|
// Who is at the party within the time interval 'when' ?
|
||
|
GuestSetT who = (*it++).second;
|
||
|
cout << when << ": " << who << endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
cout << ">>Interval Container Library: Sample party.cpp <<\n";
|
||
|
cout << "-------------------------------------------------------\n";
|
||
|
party();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Program output:
|
||
|
|
||
|
// >>Interval Container Library: Sample party.cpp <<
|
||
|
// -------------------------------------------------
|
||
|
// [sun:19:30,sun:20:10): Harry Mary
|
||
|
// [sun:20:10,sun:22:15): Diana Harry Mary Susan
|
||
|
// [sun:22:15,sun:23:00): Diana Harry Mary Peter Susan
|
||
|
// [sun:23:00,mon:00:00): Diana Peter Susan
|
||
|
// [mon:00:00,mon:00:30): Peter
|
||
|
|
||
|
|