Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- enum Size {
- small,
- medium,
- large
- };
- enum Color {
- red,
- green,
- blue
- };
- struct Item {
- std::string name;
- Size size;
- Color color;
- Item(const std::string& name, Size size, Color color):
- name(name)
- ,size(size)
- ,color(color) {}
- };
- struct ItemContainer {
- std::vector<Item> items;
- void addItem(const Item& item) {
- items.push_back(item);
- }
- std::vector<Item>& getItems() {
- return items;
- }
- };
- template <typename T>
- struct Specification {
- virtual bool is_satisfied(const T&) const = 0;
- };
- template <typename T>
- struct Filter {
- virtual std::vector<T*> filter(ItemContainer& container, const Specification<T>& spec) {
- auto &vec = container.getItems();
- std::vector<T*> res;
- for (auto& i: vec) {
- if (spec.is_satisfied(i)) {
- res.push_back(&i);
- }
- }
- return res;
- };
- };
- struct SizeSpecification: Specification<Item> {
- Size size;
- SizeSpecification(Size size): size(size) {}
- bool is_satisfied(const Item& item) const {
- return item.size == size;
- }
- };
- int main()
- {
- auto container = ItemContainer();
- container.addItem(Item("Medium Green", Size::medium, Color::green));
- container.addItem(Item("Large Red", Size::large, Color::red));
- container.addItem(Item("Small Blue", Size::small, Color::blue));
- container.addItem(Item("Small Red", Size::small, Color::red));
- Filter<Item> sizeFilter;
- SizeSpecification sizeSpec(Size::small);
- auto filteredItems = sizeFilter.filter(container, sizeSpec);
- for (const auto &item: filteredItems) {
- std::cout << "Filtered: " << item->name << std::endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement