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