]> git.tdb.fi Git - poefilter.git/blob - source/condition.h
979f1e904714032788a8daf1d850568c713f353e
[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 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 void add_lines(std::list<FilterStatement> &) const = 0;
25 };
26
27
28 class AndCondition;
29 class OrCondition;
30
31 class CompoundCondition: public Condition
32 {
33 protected:
34         std::vector<Condition *> conditions;
35
36 public:
37         virtual ~CompoundCondition();
38
39 protected:
40         void clone_to(CompoundCondition &) const;
41
42 public:
43         void add(Condition *);
44         unsigned count() const { return conditions.size(); }
45         const Condition *get(unsigned) const;
46
47         virtual Condition *flatten() const;
48 protected:
49         Condition *dispatch_flatten(Condition *, Condition *) const;
50         Condition *merge_two(Condition *, Condition *, bool) const;
51         Condition *add_merged_to(Condition *, CompoundCondition *, bool) const;
52         Condition *merge_contents_to(CompoundCondition *, CompoundCondition *) const;
53         virtual Condition *flatten(Condition *, Condition *) const = 0;
54         virtual Condition *flatten(AndCondition *, Condition *) const = 0;
55         virtual Condition *flatten(AndCondition *, AndCondition *) const = 0;
56         virtual Condition *flatten(OrCondition *, Condition *) const = 0;
57         virtual Condition *flatten(OrCondition *, AndCondition *) const = 0;
58         virtual Condition *flatten(OrCondition *, OrCondition *) const = 0;
59 };
60
61
62 class AndCondition: public CompoundCondition
63 {
64 public:
65         virtual AndCondition *clone() const;
66 protected:
67         virtual Condition *flatten(Condition *, Condition *) const;
68         virtual Condition *flatten(AndCondition *, Condition *) const;
69         virtual Condition *flatten(AndCondition *, AndCondition *) const;
70         virtual Condition *flatten(OrCondition *, Condition *) const;
71         virtual Condition *flatten(OrCondition *, AndCondition *) const;
72         virtual Condition *flatten(OrCondition *, OrCondition *) const;
73 public:
74         virtual void add_lines(std::list<FilterStatement> &) const;
75 };
76
77
78 class OrCondition: public CompoundCondition
79 {
80 public:
81         virtual OrCondition *clone() const;
82 protected:
83         virtual Condition *flatten(Condition *, Condition *) const;
84         virtual Condition *flatten(AndCondition *, Condition *) const;
85         virtual Condition *flatten(AndCondition *, AndCondition *) const;
86         virtual Condition *flatten(OrCondition *, Condition *) const;
87         virtual Condition *flatten(OrCondition *, AndCondition *) const;
88         virtual Condition *flatten(OrCondition *, OrCondition *) const;
89 public:
90         virtual void add_lines(std::list<FilterStatement> &) const;
91 };
92
93
94 class LinkedColorsCondition: public Condition
95 {
96 public:
97         struct Colors
98         {
99                 char colors[7];
100         };
101
102 private:
103         Colors colors;
104         
105 public:
106         LinkedColorsCondition(const Colors &);
107
108         virtual LinkedColorsCondition *clone() const;
109         virtual void add_lines(std::list<FilterStatement> &) const;
110 };
111
112 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);
113
114 #endif