ПримерГруппы пользователейпоказывает наличие множества операций на<interval_maps
>.
В примере есть группа пользователей<med_users
>из персонала больницы, которая имеет разрешение на обработку медицинских данных пациентов. Группа пользователей<admin_users
>имеет доступ к административным данным, таким как медицинское страхование и финансовые данные.
Членство каждого пользователя в одной из групп пользователей имеет временной интервал действия. Членство в группе начинается и заканчивается.
- Используя союзную операцию<
+
>, мы можем получить обзор унифицированных групп пользователей и дат членства сотрудников. - Вычисление пересечения<
&
>показывает, кто является членом как пользователей med_users, так и пользователей admin_users в какое время.
#include <boost/icl/gregorian.hpp>
#include <iostream>
#include <boost/icl/interval_map.hpp>
using namespace std;
using namespace boost::gregorian;
using namespace boost::icl;
typedef std::set<string> MemberSetT;
typedef interval_map<date, MemberSetT> MembershipT;
void user_groups()
{
MemberSetT mary_harry;
mary_harry.insert("Mary");
mary_harry.insert("Harry");
MemberSetT diana_susan;
diana_susan.insert("Diana");
diana_susan.insert("Susan");
MemberSetT chief_physician;
chief_physician.insert("Dr.Jekyll");
MemberSetT director_of_admin;
director_of_admin.insert("Mr.Hyde");
MembershipT med_users;
med_users.add(
make_pair(
discrete_interval<date>::closed(
from_string("2008-01-01"), from_string("2008-12-31")), mary_harry));
med_users +=
make_pair(
discrete_interval<date>::closed(
from_string("2008-01-15"), from_string("2008-12-31")),
chief_physician);
med_users +=
make_pair(
discrete_interval<date>::closed(
from_string("2008-02-01"), from_string("2008-10-15")),
director_of_admin);
MembershipT admin_users;
admin_users +=
make_pair(
discrete_interval<date>::closed(
from_string("2008-03-20"), from_string("2008-09-30")), diana_susan);
admin_users +=
make_pair(
discrete_interval<date>::closed(
from_string("2008-01-15"), from_string("2008-12-31")),
chief_physician);
admin_users +=
make_pair(
discrete_interval<date>::closed(
from_string("2008-02-01"), from_string("2008-10-15")),
director_of_admin);
MembershipT all_users = med_users + admin_users;
MembershipT super_users = med_users & admin_users;
MembershipT::iterator med_ = med_users.begin();
cout << "----- Membership of medical staff -----------------------------------\n";
while(med_ != med_users.end())
{
discrete_interval<date> when = (*med_).first;
MemberSetT who = (*med_++).second;
cout << "[" << first(when) << " - " << last(when) << "]"
<< ": " << who << endl;
}
MembershipT::iterator admin_ = admin_users.begin();
cout << "----- Membership of admin staff -------------------------------------\n";
while(admin_ != admin_users.end())
{
discrete_interval<date> when = (*admin_).first;
MemberSetT who = (*admin_++).second;
cout << "[" << first(when) << " - " << last(when) << "]"
<< ": " << who << endl;
}
MembershipT::iterator all_ = all_users.begin();
cout << "----- Membership of all users (med + admin) -------------------------\n";
while(all_ != all_users.end())
{
discrete_interval<date> when = (*all_).first;
MemberSetT who = (*all_++).second;
cout << "[" << first(when) << " - " << last(when) << "]"
<< ": " << who << endl;
}
MembershipT::iterator super_ = super_users.begin();
cout << "----- Membership of super users: intersection(med,admin) ------------\n";
while(super_ != super_users.end())
{
discrete_interval<date> when = (*super_).first;
MemberSetT who = (*super_++).second;
cout << "[" << first(when) << " - " << last(when) << "]"
<< ": " << who << endl;
}
}
int main()
{
cout << ">>Interval Container Library: Sample user_groups.cpp <<\n";
cout << "-------------------------------------------------------\n";
user_groups();
return 0;
}