Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <exception>
- #include <string>
- #include <sstream>
- #include <iomanip>
- #include <map>
- #include <set>
- using namespace std;
- class Date {
- public:
- Date() {};
- Date(const int& year, const int& month, const int& day) {
- if (month < 1 || month > 12) {
- throw invalid_argument("Month value is invalid: " + to_string(month));
- }
- if (day < 1 || day > 31) {
- throw invalid_argument("Day value is invalid: " + to_string(day));
- }
- year_ = year;
- month_ = month;
- day_ = day;
- }
- int GetYear() const { return year_; }
- int GetMonth() const { return month_; }
- int GetDay() const { return day_; }
- private:
- int year_;
- int month_;
- int day_;
- };
- bool operator<(const Date& lhs, const Date& rhs)
- {
- if (lhs.GetYear() < rhs.GetYear())
- return true;
- else if (lhs.GetYear() == rhs.GetYear() && lhs.GetMonth() < rhs.GetMonth())
- return true;
- else if (lhs.GetMonth() == rhs.GetMonth() && lhs.GetDay() < rhs.GetDay())
- return true;
- else return false;
- }
- stringstream& operator>> (stringstream& stream, Date& date) {
- string date_string;
- stream >> date_string;
- stringstream datestream(date_string);
- int year, month, day;
- datestream >> year;
- if (datestream.peek() != '-') {
- throw invalid_argument("Wrong date format: " + date_string);
- }
- datestream.ignore( );
- datestream >> month;
- if (datestream.peek() != '-') {
- throw invalid_argument("Wrong date format: " + date_string);
- }
- datestream.ignore();
- datestream >> day;
- string tail;
- datestream >> tail;
- if (tail !="" ) {
- throw invalid_argument("Wrong date format: " + date_string);
- }
- date = { year, month, day };
- return stream;
- }
- ostream& operator<< (ostream& stream, const Date& date) {
- stream << setw(4) << setfill('0') << date.GetYear() << '-'
- << setw(2) << setfill('0') << date.GetMonth() << '-'
- << setw(2) << setfill('0') << date.GetDay();
- return stream;
- }
- class Database {
- public:
- void AddEvent(const Date& date, const string& event) {
- events_[date].insert(event);
- }
- bool DeleteEvent(const Date& date, const string& event) {
- if (events_.count(date) && events_[date].count(event)) {
- events_[date].erase(event);
- return true;
- }
- return false;
- }
- int DeleteDate(const Date& date) {
- int events_count = events_[date].size();
- events_.erase(date);
- return events_count;
- }
- set<string> Find(const Date& date) const {
- set<string> events;
- if (events_.count(date) > 0) {
- try {
- events = events_.at(date);
- }
- catch (exception& ex) {}
- }
- return events;
- }
- void Print() const {
- for (auto item : events_) {
- for (auto event : item.second) {
- cout << item.first << ' ' << event << endl;
- }
- }
- }
- private:
- map<Date, set<string>> events_;
- };
- int main() {
- Database db;
- string line;
- while (getline(cin, line)) {
- stringstream stream(line);
- string cmd;
- stream >> cmd;
- if (cmd == "Add") {
- Date date;
- try {
- stream >> date;
- }
- catch (invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- string event;
- stream >> event;
- db.AddEvent(date, event);
- }
- else if (cmd == "Del") {
- Date date;
- try {
- stream >> date;
- }
- catch (invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- string event;
- stream >> event;
- if (event != "") {
- cout << (db.DeleteEvent(date, event) ? "Deleted successfully" : "Event not found") << endl;
- }
- else {
- cout << "Deleted " << db.DeleteDate(date) << " events" << endl;
- }
- }
- else if (cmd == "Find") {
- Date date;
- try {
- stream >> date;
- }
- catch (invalid_argument& ex) {
- cout << ex.what() << endl;
- return 0;
- }
- for (auto event : db.Find(date)) {
- cout << event << endl;
- }
- }
- else if (cmd == "Print") {
- db.Print();
- }
- else if (cmd != "") {
- cout << "Unknown command: " << cmd << endl;
- return 0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement