]> git.tdb.fi Git - poefilter.git/blob - source/condition.h
Use covariant return type for Condition::clone
[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 can_merge(const Condition &, const CompoundCondition &) const { return false; }
22         virtual void add_lines(std::list<FilterStatement> &) const = 0;
23         virtual void add_merged_lines(const std::vector<Condition *> &, const CompoundCondition &, std::list<FilterStatement> &) const { }
24 };
25
26
27 class CompoundCondition: public Condition
28 {
29 protected:
30         std::vector<Condition *> conditions;
31
32 public:
33         virtual ~CompoundCondition();
34
35 protected:
36         void clone_to(CompoundCondition &) const;
37
38 public:
39         void add(Condition *);
40 };
41
42
43 class AndCondition: public CompoundCondition
44 {
45 public:
46         virtual AndCondition *clone() const;
47         virtual void add_lines(std::list<FilterStatement> &) const;
48 };
49
50
51 class OrCondition: public CompoundCondition
52 {
53 public:
54         virtual OrCondition *clone() const;
55         virtual void add_lines(std::list<FilterStatement> &) const;
56 };
57
58
59 class LinkedColorsCondition: public Condition
60 {
61 public:
62         struct Colors
63         {
64                 char colors[7];
65         };
66
67 private:
68         Colors colors;
69         
70 public:
71         LinkedColorsCondition(const Colors &);
72
73         virtual LinkedColorsCondition *clone() const;
74         virtual void add_lines(std::list<FilterStatement> &) const;
75 };
76
77 void operator>>(const Msp::LexicalConverter &, LinkedColorsCondition::Colors &);
78
79 #endif