# include <iostream>
# include <fstream>
# include <map>
# include <string>
# include <cstdlib>
# include <sstream>
using namespace std;
#define JAI "Jai"
#define VEERU "Veeru"
// Abstract Class [Interface]
class busCompanies
{
public:
// virtual void writeToFile() = 0;
virtual void insert(int arrival, int departure) = 0;
virtual map<int, int> getMap() = 0;
};
class jai : public busCompanies
{
map<int, int> jaiMap;
map<string, string> jaiOutputMap;
public:
void insert(int arrival, int departure) {
jaiMap[departure] = arrival;
}
map<int, int> getMap() {
return jaiMap;
}
// void writeToFile();
};
class veeru : public busCompanies
{
map<int, int> veeruMap;
map<string, string> veeruOutputMap;
public:
void insert(int arrival, int departure) {
veeruMap[departure] = arrival;
}
map<int, int> getMap() {
return veeruMap;
}
// void writeToFile();
};
class ramgarh
{
busCompanies *bc;
public:
static busCompanies* getBusCompany(string name) {
if (name == JAI)
return new jai;
else if (name == VEERU)
return new veeru;
}
void efficientService() {
bc = new jai();
map<int, int> jMap = bc->getMap();
delete bc;
bc = new veeru();
map<int, int> vMap = bc->getMap();
map<int, int>:: iterator jMit, vMit;
for (jMit = jMap.begin(); jMit != jMap.end(); jMit++) {
int dep = jMit->first;
int arr = jMit->second;
vMit = vMap.find(dep);
if (vMit != vMap.end()) {
if (arr == vMit->second)
//remove from veeru.
}
}
};
class jointTimeTable
{
busCompanies *m_busCompany;
public:
int getTimeDifference(string, string, int*, int*);
void readInput(string fileName);
};
int jointTimeTable::getTimeDifference(string dep, string arr, int *arrTime, int *depTime) {
stringstream ss;
int depH ; int depM; int arrH; int arrM;
ss << dep;
char extra;
ss >> depH >> extra >> depM;
ss.clear();
ss << arr;
ss >> arrH >> extra >> arrM;
*depTime = depH*100 + depM;
*arrTime = arrH*100 + arrM;
int startTime = 0;
int endTime = 0;
if (arrH < depH){
startTime = 24*60 - (depH*60 + depM);
endTime = (arrH)*60+(arrM);
return startTime+endTime;
}
startTime = (depH)*60+(depM);
endTime = (arrH)*60+(arrM);
return endTime-startTime;
}
void jointTimeTable::readInput(string fileName) {
std::string line, name, arrival, departure;
// File reading and store in respective Classes.
ifstream inFile (fileName.c_str());
if (inFile.is_open()) {
while (getline(inFile, line)) {
int len = line.length();
int firstSpace = line.find(" ", 0);
name = line.substr(0, firstSpace);
int nxtSpace = line.find(" ", firstSpace+1);
arrival = line.substr(firstSpace+1, nxtSpace-firstSpace-1);
departure = line.substr(nxtSpace+1, len-nxtSpace-1);
// cout<<name<<" "<< arrival<< " "<<departure<<endl;
// insert arrival/departure in JAI/VEERU Class.
m_busCompany = ramgarh::getBusCompany(name);
int arr, dep;
int serviceTime = getTimeDifference(arrival, departure, &arr, &dep);
if (serviceTime <= 60) {
cout<<name<<" "<< arr<< " "<<dep<<endl;
m_busCompany->insert(arr, dep);
}
}
inFile.close();
} else
cout<<"File cannot be Opened"<<endl;
}
int main()
{
jointTimeTable timeTable;
timeTable.readInput("service.txt");
return 0;
}