1 #ifndef CHOICECONDITION_H_
2 #define CHOICECONDITION_H_
4 #include <msp/core/algorithm.h>
9 class ChoiceCondition: public Condition
13 typedef typename Traits::Type Type;
16 std::vector<Type> values;
19 ChoiceCondition(Type);
20 ChoiceCondition(const std::vector<Type> &);
22 virtual ChoiceCondition<T> *clone() const;
23 virtual bool equals(const Condition &) const;
24 virtual bool can_merge(const Condition &, const CompoundCondition &) const;
25 virtual ChoiceCondition<T> *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
26 virtual void add_lines(std::list<FilterStatement> &) const;
32 typedef std::string Type;
33 static const char *get_keyword() { return "Class"; }
36 typedef ChoiceCondition<ClassTraits> ClassCondition;
41 typedef std::string Type;
42 static const char *get_keyword() { return "BaseType"; }
45 typedef ChoiceCondition<BaseTypeTraits> BaseTypeCondition;
49 ChoiceCondition<T>::ChoiceCondition(Type v)
55 ChoiceCondition<T>::ChoiceCondition(const std::vector<Type> &v):
60 ChoiceCondition<T> *ChoiceCondition<T>::clone() const
62 return new ChoiceCondition<T>(values);
66 bool ChoiceCondition<T>::equals(const Condition &other) const
68 const ChoiceCondition<T> *other_choice = dynamic_cast<const ChoiceCondition<T> *>(&other);
69 if(!other_choice || values.size()!=other_choice->values.size())
72 for(unsigned i=0; i<values.size(); ++i)
73 if(values[i]!=other_choice->values[i])
80 bool ChoiceCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
82 return dynamic_cast<const ChoiceCondition<T> *>(&other) && dynamic_cast<const OrCondition *>(&parent);
86 ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
88 if(dynamic_cast<const OrCondition *>(&parent) && !conditions.empty())
90 ChoiceCondition<T> *result = new ChoiceCondition<T>(std::vector<Type>());
91 for(std::vector<const Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
93 const std::vector<Type> &v = static_cast<const ChoiceCondition<T> *>(*i)->values;
94 for(typename std::vector<Type>::const_iterator j=v.begin(); j!=v.end(); ++j)
95 if(Msp::find(result->values, *j)==result->values.end())
96 result->values.push_back(*j);
105 void ChoiceCondition<T>::add_lines(std::list<FilterStatement> &st) const
107 std::string line = Traits::get_keyword();
108 for(typename std::vector<Type>::const_iterator i=values.begin(); i!=values.end(); ++i)
109 line += Msp::format(" \"%s\"", *i);
110 FilterStatement::add_line(st, line);