]> git.tdb.fi Git - poefilter.git/blob - source/condition.h
Merge and conditions if they only differ in one sub-condition
[poefilter.git] / source / condition.h
1 #ifndef CONDITION_H_
2 #define CONDITION_H_
3
4 #include <list>
5 #include <string>
6 #include <vector>
7 #include <msp/strings/format.h>
8 #include "rarity.h"
9
10 class CompoundCondition;
11 class FilterStatement;
12
13 class Condition
14 {
15 protected:
16         Condition() { }
17 public:
18         virtual ~Condition() { }
19
20         virtual Condition *clone() const = 0;
21         virtual bool equals(const Condition &) const = 0;
22         virtual Condition *flatten() const { return clone(); }
23         virtual bool can_merge(const Condition &, const CompoundCondition &) const { return false; }
24         virtual Condition *merge(const std::vector<const Condition *> &, const CompoundCondition &) const { return 0; }
25         virtual bool is_viable() const { return true; }
26         virtual void add_lines(std::list<FilterStatement> &) const = 0;
27 };
28
29
30 class AndCondition;
31 class OrCondition;
32
33 class CompoundCondition: public Condition
34 {
35 protected:
36         std::vector<Condition *> conditions;
37
38 public:
39         virtual ~CompoundCondition();
40
41 protected:
42         void clone_to(CompoundCondition &) const;
43         bool sub_equals(const CompoundCondition &) const;
44
45 public:
46         void add(Condition *);
47         unsigned count() const { return conditions.size(); }
48         const Condition &get(unsigned) const;
49
50         virtual Condition *flatten() const;
51 protected:
52         Condition *dispatch_flatten(Condition *, Condition *) const;
53         static Condition *merge_two(Condition *, Condition *, const CompoundCondition &, bool);
54         static Condition *add_merged_to(Condition *, CompoundCondition *, bool);
55         static Condition *merge_contents_to(CompoundCondition *, CompoundCondition *);
56         virtual Condition *flatten(Condition *, Condition *) const = 0;
57         virtual Condition *flatten(AndCondition *, Condition *) const = 0;
58         virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
59         virtual Condition *flatten(OrCondition *, Condition *) const = 0;
60         virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
61         virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;
62 };
63
64
65 class AndCondition: public CompoundCondition
66 {
67 public:
68         virtual AndCondition *clone() const;
69         virtual bool equals(const Condition &) const;
70 protected:
71         virtual Condition *flatten(Condition *, Condition *) const;
72         virtual Condition *flatten(AndCondition *, Condition *) const;
73         virtual Condition *flatten(AndCondition *, AndCondition *) const;
74         virtual Condition *flatten(OrCondition *, Condition *) const;
75         virtual Condition *flatten(OrCondition *, AndCondition *) const;
76         virtual Condition *flatten(OrCondition *, OrCondition *) const;
77 public:
78         virtual bool can_merge(const Condition &, const CompoundCondition &) const;
79         virtual AndCondition *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
80 private:
81         static bool merge(const AndCondition &, const AndCondition &, const CompoundCondition &, AndCondition **);
82 public:
83         virtual bool is_viable() const;
84         virtual void add_lines(std::list<FilterStatement> &) const;
85 };
86
87
88 class OrCondition: public CompoundCondition
89 {
90 public:
91         virtual OrCondition *clone() const;
92         virtual bool equals(const Condition &) const;
93 protected:
94         virtual Condition *flatten(Condition *, Condition *) const;
95         virtual Condition *flatten(AndCondition *, Condition *) const;
96         virtual Condition *flatten(AndCondition *, AndCondition *) const;
97         virtual Condition *flatten(OrCondition *, Condition *) const;
98         virtual Condition *flatten(OrCondition *, AndCondition *) const;
99         virtual Condition *flatten(OrCondition *, OrCondition *) const;
100 public:
101         virtual bool is_viable() const;
102         virtual void add_lines(std::list<FilterStatement> &) const;
103 };
104
105
106 class LinkedColorsCondition: public Condition
107 {
108 public:
109         struct Colors
110         {
111                 char colors[7];
112         };
113
114 private:
115         Colors colors;
116         
117 public:
118         LinkedColorsCondition(const Colors &);
119
120         virtual LinkedColorsCondition *clone() const;
121         virtual bool equals(const Condition &) const;
122         virtual void add_lines(std::list<FilterStatement> &) const;
123 };
124
125 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);
126
127 #endif