1 #ifndef CHOICECONDITION_H_
2 #define CHOICECONDITION_H_
8 class ChoiceCondition: public Condition
12 typedef typename Traits::Type Type;
18 ChoiceCondition(Type);
20 virtual Condition *clone() const;
21 virtual bool can_merge(const Condition &, const CompoundCondition &) const;
22 virtual void add_lines(std::list<FilterStatement> &) const;
23 virtual void add_merged_lines(const std::vector<Condition *> &, const CompoundCondition &, std::list<FilterStatement> &) const;
29 typedef std::string Type;
30 static const char *get_keyword() { return "Class"; }
33 typedef ChoiceCondition<ClassTraits> ClassCondition;
38 typedef std::string Type;
39 static const char *get_keyword() { return "BaseType"; }
42 typedef ChoiceCondition<BaseTypeTraits> BaseTypeCondition;
45 template<typename Traits>
46 ChoiceCondition<Traits>::ChoiceCondition(Type v):
50 template<typename Traits>
51 Condition *ChoiceCondition<Traits>::clone() const
53 return new ChoiceCondition<Traits>(value);
56 template<typename Traits>
57 bool ChoiceCondition<Traits>::can_merge(const Condition &other, const CompoundCondition &parent) const
59 return dynamic_cast<const ChoiceCondition<Traits> *>(&other) && dynamic_cast<const OrCondition *>(&parent);
62 template<typename Traits>
63 void ChoiceCondition<Traits>::add_lines(std::list<FilterStatement> &st) const
65 const char *keyword = Traits::get_keyword();
66 FilterStatement::add_line(st, Msp::format("%s \"%s\"", keyword, value));
69 template<typename Traits>
70 void ChoiceCondition<Traits>::add_merged_lines(const std::vector<Condition *> &conditions, const CompoundCondition &parent, std::list<FilterStatement> &st) const
72 if(dynamic_cast<const OrCondition *>(&parent))
74 std::string line = Traits::get_keyword();
75 for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
76 line += Msp::format(" \"%s\"", static_cast<const ChoiceCondition<Traits> *>(*i)->value);
77 FilterStatement::add_line(st, line);