1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2008-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4    Distributed under the Boost Software License, Version 1.0.
5       (See accompanying file LICENCE.txt or copy at
6            http://www.boost.org/LICENSE_1_0.txt)
7 +-----------------------------------------------------------------------------*/
8 #define BOOST_TEST_MODULE icl::example_boost_party unit test
9 
10 #include <libs/icl/test/disable_test_warnings.hpp>
11 #include "../unit_test_unwarned.hpp"
12 //#include <boost/icl/set.hpp> // Needed for implicit calls of operator << on
13 //JODO CLANG                   // GuestSets via test macros.
14 
15 //------------------------------------------------------------------------------
16 // begin example code. return value added to function boost_party
17 //------------------------------------------------------------------------------
18 #include <boost/icl/ptime.hpp>
19 #include <iostream>
20 #include <boost/icl/interval_map.hpp>
21 
22 using namespace std;
23 using namespace boost::posix_time;
24 using namespace boost::icl;
25 
26 // Type set<string> collects the names of party guests. Since std::set is
27 // a model of the itl's set concept, the concept provides an operator +=
28 // that performs a set union on overlap of intervals.
29 typedef std::set<string> GuestSetT;
30 
boost_party()31 interval_map<ptime, GuestSetT> boost_party()
32 {
33     GuestSetT mary_harry;
34     mary_harry.insert("Mary");
35     mary_harry.insert("Harry");
36 
37     GuestSetT diana_susan;
38     diana_susan.insert("Diana");
39     diana_susan.insert("Susan");
40 
41     GuestSetT peter;
42     peter.insert("Peter");
43 
44     // A party is an interval map that maps time intervals to sets of guests
45     interval_map<ptime, GuestSetT> party;
46 
47     party.add( // add and element
48       make_pair(
49         interval<ptime>::right_open(
50           time_from_string("2008-05-20 19:30"),
51           time_from_string("2008-05-20 23:00")),
52         mary_harry));
53 
54     party += // element addition can also be done via operator +=
55       make_pair(
56         interval<ptime>::right_open(
57           time_from_string("2008-05-20 20:10"),
58           time_from_string("2008-05-21 00:00")),
59         diana_susan);
60 
61     party +=
62       make_pair(
63         interval<ptime>::right_open(
64           time_from_string("2008-05-20 22:15"),
65           time_from_string("2008-05-21 00:30")),
66         peter);
67 
68 
69     interval_map<ptime, GuestSetT>::iterator it = party.begin();
70     cout << "----- History of party guests -------------------------\n";
71     while(it != party.end())
72     {
73         interval<ptime>::type when = it->first;
74         // Who is at the party within the time interval 'when' ?
75         GuestSetT who = (*it++).second;
76         cout << when << ": " << who << endl;
77     }
78 
79     return party;
80 }
81 //------------------------------------------------------------------------------
82 // end example code
83 //------------------------------------------------------------------------------
84 
85 typedef interval_map<ptime, GuestSetT> PartyHistory;
86 
87 typedef PartyHistory::segment_type SegmentT;
88 
episode(const char * from,const char * to,GuestSetT guests)89 SegmentT episode(const char* from, const char* to, GuestSetT guests)
90 {
91     return make_pair( interval<ptime>
92                       ::right_open( time_from_string(from)
93                                   , time_from_string(to)   )
94                     , guests);
95 }
96 
check_party()97 PartyHistory check_party()
98 {
99     GuestSetT mary_harry;
100     mary_harry.insert("Mary");
101     mary_harry.insert("Harry");
102 
103     GuestSetT diana_susan;
104     diana_susan.insert("Diana");
105     diana_susan.insert("Susan");
106 
107     GuestSetT peter;
108     peter.insert("Peter");
109 
110     GuestSetT Diana_Harry_Mary_Susan       = mary_harry + diana_susan;
111     GuestSetT Diana_Harry_Mary_Peter_Susan = Diana_Harry_Mary_Susan + peter;
112     GuestSetT Diana_Peter_Susan            = Diana_Harry_Mary_Peter_Susan - mary_harry;
113 
114     PartyHistory party;
115 
116     party += episode("2008-05-20 19:30", "2008-05-20 20:10", mary_harry);
117     party += episode("2008-05-20 20:10", "2008-05-20 22:15", Diana_Harry_Mary_Susan);
118     party += episode("2008-05-20 22:15", "2008-05-20 23:00", Diana_Harry_Mary_Peter_Susan);
119     party += episode("2008-05-20 23:00", "2008-05-21 00:00", Diana_Peter_Susan);
120     party += episode("2008-05-21 00:00", "2008-05-21 00:30", peter);
121 
122     return party;
123 }
124 
BOOST_AUTO_TEST_CASE(icl_example_boost_party)125 BOOST_AUTO_TEST_CASE(icl_example_boost_party)
126 {
127     PartyHistory party1 = boost_party();
128     PartyHistory party2 = check_party();
129     bool party_equality = (party1==party2);
130     BOOST_CHECK(party_equality);
131     //BOOST_CHECK_EQUAL(boost_party(), check_party());
132 }
133 
134 
135