7 #include <msp/strings/format.h>
10 class CompoundCondition;
11 class FilterStatement;
18 virtual ~Condition() { }
20 virtual Condition *clone() const = 0;
21 virtual Condition *flatten() const { return clone(); }
22 virtual bool can_merge(const Condition &, const CompoundCondition &) const { return false; }
23 virtual Condition *merge(const std::vector<Condition *> &, const CompoundCondition &) const { return 0; }
24 virtual bool is_viable() const { return true; }
25 virtual void add_lines(std::list<FilterStatement> &) const = 0;
32 class CompoundCondition: public Condition
35 std::vector<Condition *> conditions;
38 virtual ~CompoundCondition();
41 void clone_to(CompoundCondition &) const;
44 void add(Condition *);
45 unsigned count() const { return conditions.size(); }
46 const Condition *get(unsigned) const;
48 virtual Condition *flatten() const;
50 Condition *dispatch_flatten(Condition *, Condition *) const;
51 Condition *merge_two(Condition *, Condition *, bool) const;
52 Condition *add_merged_to(Condition *, CompoundCondition *, bool) const;
53 Condition *merge_contents_to(CompoundCondition *, CompoundCondition *) const;
54 virtual Condition *flatten(Condition *, Condition *) const = 0;
55 virtual Condition *flatten(AndCondition *, Condition *) const = 0;
56 virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
57 virtual Condition *flatten(OrCondition *, Condition *) const = 0;
58 virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
59 virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;
63 class AndCondition: public CompoundCondition
66 virtual AndCondition *clone() const;
68 virtual Condition *flatten(Condition *, Condition *) const;
69 virtual Condition *flatten(AndCondition *, Condition *) const;
70 virtual Condition *flatten(AndCondition *, AndCondition *) const;
71 virtual Condition *flatten(OrCondition *, Condition *) const;
72 virtual Condition *flatten(OrCondition *, AndCondition *) const;
73 virtual Condition *flatten(OrCondition *, OrCondition *) const;
75 virtual bool is_viable() const;
76 virtual void add_lines(std::list<FilterStatement> &) const;
80 class OrCondition: public CompoundCondition
83 virtual OrCondition *clone() const;
85 virtual Condition *flatten(Condition *, Condition *) const;
86 virtual Condition *flatten(AndCondition *, Condition *) const;
87 virtual Condition *flatten(AndCondition *, AndCondition *) const;
88 virtual Condition *flatten(OrCondition *, Condition *) const;
89 virtual Condition *flatten(OrCondition *, AndCondition *) const;
90 virtual Condition *flatten(OrCondition *, OrCondition *) const;
92 virtual bool is_viable() const;
93 virtual void add_lines(std::list<FilterStatement> &) const;
97 class LinkedColorsCondition: public Condition
109 LinkedColorsCondition(const Colors &);
111 virtual LinkedColorsCondition *clone() const;
112 virtual void add_lines(std::list<FilterStatement> &) const;
115 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);