Listing 3: Example of using ManyMany class with and without link attribute

#include <string>
#include "Relations.h"
#include <iostream>
using namespace std;

//Link attribute structure
//Uniquely identifies a student-class link
struct Record{

   Record(const string& grade = string(), int absenses = 0) 
      : Grade(grade), Absenses(absenses){}

   string Grade;
   int    Absenses;
};

main(){

   /*
   There is a many-to-many relationship between students and 
   classes: a student might be in many classes and a class might 
   have many students
   */

    //Many-To-Many relationship with a link attribute
    typedef ManyMany <string, long, less<string>, less<long>, 
                      Record> School_Rel;
    School_Rel school;

    Record r1("A", 1);
    school.insert("Peter", 101, r1);

    Record r2("B", 2);
    school.insert("Peter", 102, r2);

    Record r3("C", 3);
    school.insert("Peter", 103, r3);

    Record r4("A", 1);
    school.insert("Jane", 101, r4);

    Record r5("B", 1);
    school.insert("Jane", 103, r5);

    Record r6("A", 4);
    school.insert("Jane", 104, r6);

    cout << "Listing Peter's classes:" << endl;
    for(School_Rel::iterator2 it = school.begin("Peter"), 
        end = school.end("Peter"); it != end; ++it)
        cout << *it << endl;

    cout << endl;

    cout << "Listing students in 103: " << endl;
    for(School_Rel::iterator1 it = school.begin(103),
        end = school.end(103); it != end; ++it)
       cout << *it << endl;

    cout << endl;

    const Record* r = school.getAttribute("Peter", 103);

    if(r){
        cout << "Peter's  Grade and absenses for 103:" << endl;
        cout << "Grade - " << r->Grade << " Absenses - " 
             << r->Absenses << endl;
    }

    ////////////////////////////////////////////////////////////

    ////Many-To-Many relationship without a link attribute
    ManyMany <string, long> school1;

    school1.insert("Peter", 101);
    school1.insert("Peter", 102);
    school1.insert("Peter", 103);
    school1.insert("Jane", 101);
    school1.insert("Jane", 103);
    school1.insert("Jane", 104);

    cout << "Listing Jane's classes:" << endl;
    for(ManyMany <string, long> ::iterator2 it = 
        school1.begin("Jane"), end = school1.end("Jane");
        it != end; ++it)
        cout << *it << endl;

    cout << endl;

    cout << "Listing students in 101: " << endl;
    for(ManyMany <string, long>::iterator1 it = 
        school1.begin(101), end = school1.end(101);
        it != end; ++it)
        cout << *it << endl;
}

/*
Output:

Listing Peter's classes:
101
102
103

Listing students in 103:
Peter
Jane

Peter's  Grade and absenses for 103:
Grade - C Absenses - 3
Listing Jane's classes:
101
103
104

Listing students in 101:
Peter
Jane

*/
— End of Listing —