--sas

Untitled

May 12th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. //
  2. // Created by stas on 5/5/19.
  3. //
  4.  
  5. #pragma once
  6.  
  7. #include "date.h"
  8. #include "condition_parser.h"
  9.  
  10. #include <sstream>
  11. #include <map>
  12. #include <vector>
  13. #include <algorithm>
  14. #include <stack>
  15. #include <utility>
  16. #include <set>
  17.  
  18. using namespace std;
  19.  
  20. ostream& operator<< (ostream& os, const pair<Date, string>&);
  21.  
  22. class Database {
  23. public:
  24.     void Add(const Date& date, const string& event);
  25.  
  26.     void Print(ostream& os) const;
  27.  
  28.     template <typename Pr>
  29.     int RemoveIf(Pr predicate);
  30.  
  31.     template <typename Pr>
  32.     vector<pair<Date, string>> FindIf(Pr predicate) const;
  33.  
  34. //    void RemoveEmpty();
  35.  
  36.     pair<Date, string> Last(const Date& date) const;
  37.  
  38. private:
  39.     map<Date, pair<vector<string>, set<string>>> database_;
  40. };
  41.  
  42. template <typename Pr>
  43. int Database::RemoveIf(Pr predicate) {
  44.     int count = 0;
  45.     stack<Date> empty_dates;
  46.     for (auto& c : database_) {
  47.         const Date& date = c.first;
  48.         auto& events = c.second.first;
  49.  
  50.         auto it = remove_if(events.begin(), events.end(),
  51.                 [date, predicate] (const string& s) {
  52.                     return predicate(date, s);
  53.         });
  54.  
  55.         count += distance(it, events.end());
  56.  
  57.         if (it == events.begin())
  58.             empty_dates.push(date);
  59.         else
  60.             events.erase(it, events.end());
  61.     }
  62.     while(!empty_dates.empty()) {
  63.         database_.erase(empty_dates.top());
  64.         empty_dates.pop();
  65.     }
  66.     return count;
  67. }
  68.  
  69. template <typename Pr>
  70. vector<pair<Date, string>> Database::FindIf(Pr predicate) const {
  71.     vector<pair<Date, string>> res;
  72.     for (const auto& c : database_) {
  73.         const Date& date = c.first;
  74.         const vector<string>& events = c.second.first;
  75.         for (const auto& event : events) {
  76.             if (predicate(date, event))
  77.                 res.push_back(pair{date, event});
  78.         }
  79.     }
  80.     return res;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment