Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.
PrevUpHomeNext

User groups

Example user groups shows the availability of set operations on interval_maps.

In the example there is a user group med_users of a hospital staff that has the authorisation to handle medical data of patients. User group admin_users has access to administrative data like health insurance and financial data.

The membership for each user in one of the user groups has a time interval of validity. The group membership begins and ends.

// The next line includes <boost/gregorian/date.hpp>
// and a few lines of adapter code.
#include <boost/icl/gregorian.hpp>
#include <iostream>
#include <boost/icl/interval_map.hpp>

using namespace std;
using namespace boost::gregorian;
using namespace boost::icl;

// Type icl::set<string> collects the names a user group's members. Therefore
// it needs to implement operator += that performs a set union on overlap of 
// intervals.
typedef std::set<string> MemberSetT;

// boost::gregorian::date is the domain type the interval map. 
// It's key values are therefore time intervals: discrete_interval<date>. The content
// is the set of names: MemberSetT.
typedef interval_map<date, MemberSetT> MembershipT;

// Collect user groups for medical and administrative staff and perform
// union and intersection operations on the collected membership schedules.
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");

    //----- Collecting members of user group: med_users -------------------
    MembershipT med_users;

    med_users.add( // add and element
      make_pair(
        discrete_interval<date>::closed(
          from_string("2008-01-01"), from_string("2008-12-31")), mary_harry));

    med_users +=  // element addition can also be done via operator +=
      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);

    //----- Collecting members of user group: admin_users ------------------
    MembershipT admin_users;

    admin_users += // element addition can also be done via operator +=
      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;
        // Who is member of group med_users within the time interval 'when' ?
        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;
        // Who is member of group admin_users within the time interval 'when' ?
        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;
        // Who is member of group med_users OR admin_users ?
        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;
        // Who is member of group med_users AND admin_users ?
        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;
}

// Program output:
/*-----------------------------------------------------------------------------
>>Interval Container Library: Sample user_groups.cpp <<
-------------------------------------------------------
----- Membership of medical staff -----------------------------------
[2008-Jan-01 - 2008-Jan-14]: Harry Mary
[2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll Harry Mary
[2008-Feb-01 - 2008-Oct-15]: Dr.Jekyll Harry Mary Mr.Hyde
[2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll Harry Mary
----- Membership of admin staff -------------------------------------
[2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll
[2008-Feb-01 - 2008-Mar-19]: Dr.Jekyll Mr.Hyde
[2008-Mar-20 - 2008-Sep-30]: Diana Dr.Jekyll Mr.Hyde Susan
[2008-Oct-01 - 2008-Oct-15]: Dr.Jekyll Mr.Hyde
[2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll
----- Membership of all users (med + admin) -------------------------
[2008-Jan-01 - 2008-Jan-14]: Harry Mary
[2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll Harry Mary
[2008-Feb-01 - 2008-Mar-19]: Dr.Jekyll Harry Mary Mr.Hyde
[2008-Mar-20 - 2008-Sep-30]: Diana Dr.Jekyll Harry Mary Mr.Hyde Susan
[2008-Oct-01 - 2008-Oct-15]: Dr.Jekyll Harry Mary Mr.Hyde
[2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll Harry Mary
----- Membership of super users: intersection(med,admin) ------------
[2008-Jan-15 - 2008-Jan-31]: Dr.Jekyll
[2008-Feb-01 - 2008-Oct-15]: Dr.Jekyll Mr.Hyde
[2008-Oct-16 - 2008-Dec-31]: Dr.Jekyll
-----------------------------------------------------------------------------*/


PrevUpHomeNext