1 /*-----------------------------------------------------------------------------+
2 Interval Container Library
3 Author: Joachim Faulhaber
4 Copyright (c) 2007-2009: Joachim Faulhaber
5 Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
6 +------------------------------------------------------------------------------+
7    Distributed under the Boost Software License, Version 1.0.
8       (See accompanying file LICENCE.txt or copy at
9            http://www.boost.org/LICENSE_1_0.txt)
10 +-----------------------------------------------------------------------------*/
11 /** Example user_groups.cpp \file user_groups.cpp
12     \brief Shows the availability of set operations on interval maps.
13 
14     In the example there is a user group 'med_users' of a hosptial staff
15     that has the authorisation to handle medical data of patients.
16     User group 'admin_users' has access to administrative data like
17     health insurance and invoice data.
18 
19     The membership for each user in one of the user groups has a time
20     interval of validity. The group membership begins and ends.
21 
22     Using a union operation '+' we can have an overview over both
23     user groups and the membership dates of employees.
24 
25     Computing an intersection '&' shows the super users. The persons
26     that are members of both med_users and admin_users and the times
27     of the joint memberships.
28 
29     \include user_groups_/user_groups.cpp
30 */
31 //[example_user_groups
32 // The next line includes <boost/gregorian/date.hpp>
33 // and a few lines of adapter code.
34 #include <boost/icl/gregorian.hpp>
35 #include <iostream>
36 #include <boost/icl/interval_map.hpp>
37 
38 using namespace std;
39 using namespace boost::gregorian;
40 using namespace boost::icl;
41 
42 // Type icl::set<string> collects the names a user group's members. Therefore
43 // it needs to implement operator += that performs a set union on overlap of
44 // intervals.
45 typedef std::set<string> MemberSetT;
46 
47 // boost::gregorian::date is the domain type the interval map.
48 // It's key values are therefore time intervals: discrete_interval<date>. The content
49 // is the set of names: MemberSetT.
50 typedef interval_map<date, MemberSetT> MembershipT;
51 
52 // Collect user groups for medical and administrative staff and perform
53 // union and intersection operations on the collected membership schedules.
user_groups()54 void user_groups()
55 {
56     MemberSetT mary_harry;
57     mary_harry.insert("Mary");
58     mary_harry.insert("Harry");
59 
60     MemberSetT diana_susan;
61     diana_susan.insert("Diana");
62     diana_susan.insert("Susan");
63 
64     MemberSetT chief_physician;
65     chief_physician.insert("Dr.Jekyll");
66 
67     MemberSetT director_of_admin;
68     director_of_admin.insert("Mr.Hyde");
69 
70     //----- Collecting members of user group: med_users -------------------
71     MembershipT med_users;
72 
73     med_users.add( // add and element
74       make_pair(
75         discrete_interval<date>::closed(
76           from_string("2008-01-01"), from_string("2008-12-31")), mary_harry));
77 
78     med_users +=  // element addition can also be done via operator +=
79       make_pair(
80         discrete_interval<date>::closed(
81           from_string("2008-01-15"), from_string("2008-12-31")),
82           chief_physician);
83 
84     med_users +=
85       make_pair(
86         discrete_interval<date>::closed(
87           from_string("2008-02-01"), from_string("2008-10-15")),
88           director_of_admin);
89 
90     //----- Collecting members of user group: admin_users ------------------
91     MembershipT admin_users;
92 
93     admin_users += // element addition can also be done via operator +=
94       make_pair(
95         discrete_interval<date>::closed(
96           from_string("2008-03-20"), from_string("2008-09-30")), diana_susan);
97 
98     admin_users +=
99       make_pair(
100         discrete_interval<date>::closed(
101           from_string("2008-01-15"), from_string("2008-12-31")),
102           chief_physician);
103 
104     admin_users +=
105       make_pair(
106         discrete_interval<date>::closed(
107           from_string("2008-02-01"), from_string("2008-10-15")),
108           director_of_admin);
109 
110     MembershipT all_users   = med_users + admin_users;
111 
112     MembershipT super_users = med_users & admin_users;
113 
114     MembershipT::iterator med_ = med_users.begin();
115     cout << "----- Membership of medical staff -----------------------------------\n";
116     while(med_ != med_users.end())
117     {
118         discrete_interval<date> when = (*med_).first;
119         // Who is member of group med_users within the time interval 'when' ?
120         MemberSetT who = (*med_++).second;
121         cout << "[" << first(when) << " - " << last(when) << "]"
122              << ": " << who << endl;
123     }
124 
125     MembershipT::iterator admin_ = admin_users.begin();
126     cout << "----- Membership of admin staff -------------------------------------\n";
127     while(admin_ != admin_users.end())
128     {
129         discrete_interval<date> when = (*admin_).first;
130         // Who is member of group admin_users within the time interval 'when' ?
131         MemberSetT who = (*admin_++).second;
132         cout << "[" << first(when) << " - " << last(when) << "]"
133              << ": " << who << endl;
134     }
135 
136     MembershipT::iterator all_ = all_users.begin();
137     cout << "----- Membership of all users (med + admin) -------------------------\n";
138     while(all_ != all_users.end())
139     {
140         discrete_interval<date> when = (*all_).first;
141         // Who is member of group med_users OR admin_users ?
142         MemberSetT who = (*all_++).second;
143         cout << "[" << first(when) << " - " << last(when) << "]"
144              << ": " << who << endl;
145     }
146 
147     MembershipT::iterator super_ = super_users.begin();
148     cout << "----- Membership of super users: intersection(med,admin) ------------\n";
149     while(super_ != super_users.end())
150     {
151         discrete_interval<date> when = (*super_).first;
152         // Who is member of group med_users AND admin_users ?
153         MemberSetT who = (*super_++).second;
154         cout << "[" << first(when) << " - " << last(when) << "]"
155              << ": " << who << endl;
156     }
157 
158 }
159 
160 
main()161 int main()
162 {
163     cout << ">>Interval Container Library: Sample user_groups.cpp <<\n";
164     cout << "-------------------------------------------------------\n";
165     user_groups();
166     return 0;
167 }
168 
169 // Program output:
170 /*-----------------------------------------------------------------------------
171 >>Interval Container Library: Sample user_groups.cpp <<
172 -------------------------------------------------------
173 ----- Membership of medical staff -----------------------------------
174 [2008-Jan-01 - 2008-Jan-14]: Harry Mary
175 [2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll Harry Mary
176 [2008-Feb-01 - 2008-Oct-15]: Dr.Jekyll Harry Mary Mr.Hyde
177 [2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll Harry Mary
178 ----- Membership of admin staff -------------------------------------
179 [2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll
180 [2008-Feb-01 - 2008-Mar-19]: Dr.Jekyll Mr.Hyde
181 [2008-Mar-20 - 2008-Sep-30]: Diana Dr.Jekyll Mr.Hyde Susan
182 [2008-Oct-01 - 2008-Oct-15]: Dr.Jekyll Mr.Hyde
183 [2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll
184 ----- Membership of all users (med + admin) -------------------------
185 [2008-Jan-01 - 2008-Jan-14]: Harry Mary
186 [2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll Harry Mary
187 [2008-Feb-01 - 2008-Mar-19]: Dr.Jekyll Harry Mary Mr.Hyde
188 [2008-Mar-20 - 2008-Sep-30]: Diana Dr.Jekyll Harry Mary Mr.Hyde Susan
189 [2008-Oct-01 - 2008-Oct-15]: Dr.Jekyll Harry Mary Mr.Hyde
190 [2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll Harry Mary
191 ----- Membership of super users: intersection(med,admin) ------------
192 [2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll
193 [2008-Feb-01 - 2008-Oct-15]: Dr.Jekyll Mr.Hyde
194 [2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll
195 -----------------------------------------------------------------------------*/
196 //]
197 
198