1 #ifndef CHOICECONDITION_H_
2 #define CHOICECONDITION_H_
8 class ChoiceCondition: public Condition
12 typedef typename Traits::Type Type;
15 std::vector<Type> values;
18 ChoiceCondition(Type);
19 ChoiceCondition(const std::vector<Type> &);
21 virtual ChoiceCondition<T> *clone() const;
22 virtual bool can_merge(const Condition &, const CompoundCondition &) const;
23 virtual ChoiceCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
24 virtual void add_lines(std::list<FilterStatement> &) const;
30 typedef std::string Type;
31 static const char *get_keyword() { return "Class"; }
34 typedef ChoiceCondition<ClassTraits> ClassCondition;
39 typedef std::string Type;
40 static const char *get_keyword() { return "BaseType"; }
43 typedef ChoiceCondition<BaseTypeTraits> BaseTypeCondition;
47 ChoiceCondition<T>::ChoiceCondition(Type v)
53 ChoiceCondition<T>::ChoiceCondition(const std::vector<Type> &v):
58 ChoiceCondition<T> *ChoiceCondition<T>::clone() const
60 return new ChoiceCondition<T>(values);
64 bool ChoiceCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
66 return dynamic_cast<const ChoiceCondition<T> *>(&other) && dynamic_cast<const OrCondition *>(&parent);
70 ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
72 if(dynamic_cast<const OrCondition *>(&parent) && !conditions.empty())
74 ChoiceCondition<T> *result = 0;
75 for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
77 const std::vector<Type> &v = static_cast<ChoiceCondition<T> *>(*i)->values;
79 result = new ChoiceCondition<T>(v);
81 result->values.insert(result->values.end(), v.begin(), v.end());
90 void ChoiceCondition<T>::add_lines(std::list<FilterStatement> &st) const
92 std::string line = Traits::get_keyword();
93 for(typename std::vector<Type>::const_iterator i=values.begin(); i!=values.end(); ++i)
94 line += Msp::format(" \"%s\"", *i);
95 FilterStatement::add_line(st, line);