]> git.tdb.fi Git - poefilter.git/blob - source/condition.h
Tighten some parameters and return values
[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<const Condition *> &, const CompoundCondition &) const { return 0; }
24         virtual bool is_viable() const { return true; }
25         virtual void add_lines(std::list<FilterStatement> &) const = 0;
26 };
27
28
29 class AndCondition;
30 class OrCondition;
31
32 class CompoundCondition: public Condition
33 {
34 protected:
35         std::vector<Condition *> conditions;
36
37 public:
38         virtual ~CompoundCondition();
39
40 protected:
41         void clone_to(CompoundCondition &) const;
42
43 public:
44         void add(Condition *);
45         unsigned count() const { return conditions.size(); }
46         const Condition &get(unsigned) const;
47
48         virtual Condition *flatten() const;
49 protected:
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;
60 };
61
62
63 class AndCondition: public CompoundCondition
64 {
65 public:
66         virtual AndCondition *clone() const;
67 protected:
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;
74 public:
75         virtual bool is_viable() const;
76         virtual void add_lines(std::list<FilterStatement> &) const;
77 };
78
79
80 class OrCondition: public CompoundCondition
81 {
82 public:
83         virtual OrCondition *clone() const;
84 protected:
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;
91 public:
92         virtual bool is_viable() const;
93         virtual void add_lines(std::list<FilterStatement> &) const;
94 };
95
96
97 class LinkedColorsCondition: public Condition
98 {
99 public:
100         struct Colors
101         {
102                 char colors[7];
103         };
104
105 private:
106         Colors colors;
107         
108 public:
109         LinkedColorsCondition(const Colors &);
110
111         virtual LinkedColorsCondition *clone() const;
112         virtual void add_lines(std::list<FilterStatement> &) const;
113 };
114
115 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);
116
117 #endif