Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // Created by stas on 5/5/19.
- //
- #pragma once
- #include "date.h"
- #include "condition_parser.h"
- #include <sstream>
- #include <map>
- #include <vector>
- #include <algorithm>
- #include <stack>
- #include <utility>
- #include <set>
- using namespace std;
- ostream& operator<< (ostream& os, const pair<Date, string>&);
- class Database {
- public:
- void Add(const Date& date, const string& event);
- void Print(ostream& os) const;
- template <typename Pr>
- int RemoveIf(Pr predicate);
- template <typename Pr>
- vector<pair<Date, string>> FindIf(Pr predicate) const;
- // void RemoveEmpty();
- pair<Date, string> Last(const Date& date) const;
- private:
- map<Date, pair<vector<string>, set<string>>> database_;
- };
- template <typename Pr>
- int Database::RemoveIf(Pr predicate) {
- int count = 0;
- stack<Date> empty_dates;
- for (auto& c : database_) {
- const Date& date = c.first;
- auto& events = c.second.first;
- auto it = remove_if(events.begin(), events.end(),
- [date, predicate] (const string& s) {
- return predicate(date, s);
- });
- count += distance(it, events.end());
- if (it == events.begin())
- empty_dates.push(date);
- else
- events.erase(it, events.end());
- }
- while(!empty_dates.empty()) {
- database_.erase(empty_dates.top());
- empty_dates.pop();
- }
- return count;
- }
- template <typename Pr>
- vector<pair<Date, string>> Database::FindIf(Pr predicate) const {
- vector<pair<Date, string>> res;
- for (const auto& c : database_) {
- const Date& date = c.first;
- const vector<string>& events = c.second.first;
- for (const auto& event : events) {
- if (predicate(date, event))
- res.push_back(pair{date, event});
- }
- }
- return res;
- }
Advertisement
Add Comment
Please, Sign In to add comment