Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. enum Size {
  6.   small,
  7.   medium,
  8.   large
  9. };
  10.  
  11. enum Color {
  12.   red,
  13.   green,
  14.   blue
  15. };
  16.  
  17. struct Item {
  18.   std::string name;
  19.   Size size;
  20.   Color color;  
  21.   Item(const std::string& name, Size size, Color color):
  22.   name(name)
  23.   ,size(size)
  24.   ,color(color) {}
  25. };
  26.  
  27. struct ItemContainer {
  28.   std::vector<Item> items;
  29.  
  30.   void addItem(const Item& item) {
  31.     items.push_back(item);
  32.   }
  33.  
  34.   std::vector<Item>& getItems() {
  35.     return items;
  36.   }
  37. };
  38.  
  39. template <typename T>
  40. struct Specification {
  41.   virtual bool is_satisfied(const T&) const = 0;
  42. };
  43.  
  44. template <typename T>
  45. struct Filter {
  46.   virtual std::vector<T*> filter(ItemContainer& container, const Specification<T>& spec) {
  47.     auto &vec = container.getItems();
  48.  
  49.     std::vector<T*> res;
  50.  
  51.      for (auto& i: vec) {
  52.        if (spec.is_satisfied(i)) {
  53.          res.push_back(&i);
  54.        }
  55.      }
  56.  
  57.      return res;
  58.   };
  59. };
  60.  
  61. struct SizeSpecification: Specification<Item> {
  62.   Size size;
  63.   SizeSpecification(Size size): size(size) {}
  64.  
  65.    bool is_satisfied(const Item& item) const {
  66.      return item.size == size;
  67.    }
  68. };
  69.  
  70.  
  71. int main()
  72. {  
  73.   auto container = ItemContainer();
  74.   container.addItem(Item("Medium Green", Size::medium, Color::green));
  75.   container.addItem(Item("Large Red", Size::large, Color::red));
  76.   container.addItem(Item("Small Blue", Size::small, Color::blue));
  77.   container.addItem(Item("Small Red", Size::small, Color::red));
  78.  
  79.   Filter<Item> sizeFilter;
  80.   SizeSpecification sizeSpec(Size::small);
  81.  
  82.   auto filteredItems = sizeFilter.filter(container, sizeSpec);
  83.   for (const auto &item: filteredItems) {
  84.     std::cout << "Filtered: " << item->name << std::endl;
  85.   }
  86.  
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement