/*-----------------------------------------------------------------------------+ Interval Container Library Author: Joachim Faulhaber Copyright (c) 2007-2009: 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) +-----------------------------------------------------------------------------*/ /** Example partys_tallest_guests.cpp \file partys_tallest_guests.cpp \brief Using aggregate on overlap the heights of the party's tallest guests are computed. In partys_tallest_guests.cpp we use a different instantiation of interval map templates to compute maxima of guest heights. Instead of aggregating groups of people attending the party in time we aggregate the maximum of guest height for the time intervals. Using a joining interval_map results in a smaller map: All interval value pairs are joined if the maximum does not change in time. Using a split_interval_map results in a larger map: All splits of intervals that occur due to entering and leaving of guests are preserved in the split_interval_map. \include partys_tallest_guests_/partys_tallest_guests.cpp */ //[example_partys_tallest_guests // The next line includes // and a few lines of adapter code. #include #include #include #include using namespace std; using namespace boost::posix_time; using namespace boost::icl; // A party's height shall be defined as the maximum height of all guests ;-) // The last parameter 'inplace_max' is a functor template that calls a max // aggregation on overlap. typedef interval_map PartyHeightHistoryT; // Using a split_interval_map we preserve interval splittings that occurred via insertion. typedef split_interval_map PartyHeightSplitHistoryT; void partys_height() { PartyHeightHistoryT tallest_guest; tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 19:30"), time_from_string("2008-05-20 23:00")), 180); // Mary & Harry: Harry is 1,80 m tall. tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 20:10"), time_from_string("2008-05-21 00:00")), 170); // Diana & Susan: Diana is 1,70 m tall. tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 22:15"), time_from_string("2008-05-21 00:30")), 200); // Peters height is 2,00 m PartyHeightHistoryT::iterator height_ = tallest_guest.begin(); cout << "-------------- History of maximum guest height -------------------\n"; while(height_ != tallest_guest.end()) { discrete_interval when = height_->first; // Of what height are the tallest guests within the time interval 'when' ? int height = (*height_++).second; cout << "[" << first(when) << " - " << upper(when) << ")" << ": " << height <<" cm = " << height/30.48 << " ft" << endl; } } // Next we are using a split_interval_map instead of a joining interval_map void partys_split_height() { PartyHeightSplitHistoryT tallest_guest; // adding an element can be done wrt. simple aggregate functions // like e.g. min, max etc. in their 'inplace' or op= incarnation tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 19:30"), time_from_string("2008-05-20 23:00")), 180); // Mary & Harry: Harry is 1,80 m tall. tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 20:10"), time_from_string("2008-05-21 00:00")), 170); // Diana & Susan: Diana is 1,70 m tall. tallest_guest += make_pair( discrete_interval::right_open( time_from_string("2008-05-20 22:15"), time_from_string("2008-05-21 00:30")), 200); // Peters height is 2,00 m PartyHeightSplitHistoryT::iterator height_ = tallest_guest.begin(); cout << "\n"; cout << "-------- Split History of maximum guest height -------------------\n"; cout << "--- Same map as above but split for every interval insertion. ---\n"; while(height_ != tallest_guest.end()) { discrete_interval when = height_->first; // Of what height are the tallest guests within the time interval 'when' ? int height = (*height_++).second; cout << "[" << first(when) << " - " << upper(when) << ")" << ": " << height <<" cm = " << height/30.48 << " ft" << endl; } } int main() { cout << ">>Interval Container Library: Sample partys_tallest_guests.cpp <<\n"; cout << "------------------------------------------------------------------\n"; partys_height(); partys_split_height(); return 0; } // Program output: /*----------------------------------------------------------------------------- >>Interval Container Library: Sample partys_tallest_guests.cpp << ------------------------------------------------------------------ -------------- History of maximum guest height ------------------- [2008-May-20 19:30:00 - 2008-May-20 22:15:00): 180 cm = 5.90551 ft [2008-May-20 22:15:00 - 2008-May-21 00:30:00): 200 cm = 6.56168 ft -------- Split History of maximum guest height ------------------- --- Same map as above but split for every interval insertion. --- [2008-May-20 19:30:00 - 2008-May-20 20:10:00): 180 cm = 5.90551 ft [2008-May-20 20:10:00 - 2008-May-20 22:15:00): 180 cm = 5.90551 ft [2008-May-20 22:15:00 - 2008-May-20 23:00:00): 200 cm = 6.56168 ft [2008-May-20 23:00:00 - 2008-May-21 00:00:00): 200 cm = 6.56168 ft [2008-May-21 00:00:00 - 2008-May-21 00:30:00): 200 cm = 6.56168 ft -----------------------------------------------------------------------------*/ //]