#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct person
{
string name;
string first_name;
unsigned age;
char gender;
};
bool operator<(const person& lhs, const person& rhs)
{
if(lhs.name < rhs.name) return true;
return lhs.first_name < rhs.first_name;
}
ostream& operator<<(ostream& os, const person& dude)
{
return os << dude.first_name << " " << dude.name << " " << dude.age << " " << dude.gender;
}
struct registry
{
vector<person> people;
void print(string first_name)
{
for(vector<person>::iterator iter = people.begin(); iter != people.end(); ++iter)
if(iter->first_name == first_name)
cout << *iter << endl;
}
void print_all()
{
for(vector<person>::iterator iter = people.begin(); iter != people.end(); ++iter)
cout << *iter << endl;
}
void remove(string first_name, string name)
{
cout << "remove " << first_name << " " << name << endl;
for(vector<person>::iterator iter = people.begin(); iter != people.end(); ++iter)
if(iter->first_name == first_name && iter->name == name)
{
people.erase(iter);
return;
}
}
void remove_all()
{
people.resize(0);
}
void sort()
{
std::sort(people.begin(), people.end());
}
};
void cmd_add(registry& reg, istream& in)
{
cout << "cmd_add\n";
person new_person;
in >> new_person.first_name;
in >> new_person.name;
in >> new_person.gender;
in >> new_person.age;
reg.people.push_back(new_person);
}
void cmd_print(registry& reg, istream& in)
{
string filter;
in >> filter;
if(filter == "all")
reg.print_all();
else
reg.print(filter.c_str() + 10);
}
void cmd_delete(registry& reg, istream& in)
{
string filter;
in >> filter;
if(filter == "all")
reg.remove_all();
else
{
string second_filter;
in >> second_filter;
reg.remove(filter.c_str() + 10, second_filter.c_str() + 5);
}
}
void cmd_sort(registry& reg, istream& in)
{
reg.sort();
}
int main()
{
std::map<string, void (*)(registry&, istream&)> commands;
commands["add"] = cmd_add;
commands["print"] = cmd_print;
commands["delete"] = cmd_delete;
commands["sort"] = cmd_sort;
registry reg;
while(cin.good())
{
string command;
cin >> command;
commands[command](reg, cin);
}
}