#ifndef CHOICECONDITION_H_
#define CHOICECONDITION_H_
+#include <msp/core/algorithm.h>
#include "condition.h"
#include "filter.h"
typedef typename Traits::Type Type;
private:
- Type value;
+ std::vector<Type> values;
public:
ChoiceCondition(Type);
+ ChoiceCondition(const std::vector<Type> &);
virtual ChoiceCondition<T> *clone() const;
virtual bool can_merge(const Condition &, const CompoundCondition &) const;
+ virtual ChoiceCondition<T> *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
virtual void add_lines(std::list<FilterStatement> &) const;
- virtual void add_merged_lines(const std::vector<Condition *> &, const CompoundCondition &, std::list<FilterStatement> &) const;
};
template<typename T>
-ChoiceCondition<T>::ChoiceCondition(Type v):
- value(v)
+ChoiceCondition<T>::ChoiceCondition(Type v)
+{
+ values.push_back(v);
+}
+
+template<typename T>
+ChoiceCondition<T>::ChoiceCondition(const std::vector<Type> &v):
+ values(v)
{ }
template<typename T>
ChoiceCondition<T> *ChoiceCondition<T>::clone() const
{
- return new ChoiceCondition<T>(value);
+ return new ChoiceCondition<T>(values);
}
template<typename T>
}
template<typename T>
-void ChoiceCondition<T>::add_lines(std::list<FilterStatement> &st) const
+ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
{
- const char *keyword = Traits::get_keyword();
- FilterStatement::add_line(st, Msp::format("%s \"%s\"", keyword, value));
+ if(dynamic_cast<const OrCondition *>(&parent) && !conditions.empty())
+ {
+ ChoiceCondition<T> *result = new ChoiceCondition<T>(std::vector<Type>());
+ for(std::vector<const Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
+ {
+ const std::vector<Type> &v = static_cast<const ChoiceCondition<T> *>(*i)->values;
+ for(typename std::vector<Type>::const_iterator j=v.begin(); j!=v.end(); ++j)
+ if(Msp::find(result->values, *j)==result->values.end())
+ result->values.push_back(*j);
+ }
+ return result;
+ }
+ else
+ return 0;
}
template<typename T>
-void ChoiceCondition<T>::add_merged_lines(const std::vector<Condition *> &conditions, const CompoundCondition &parent, std::list<FilterStatement> &st) const
+void ChoiceCondition<T>::add_lines(std::list<FilterStatement> &st) const
{
- if(dynamic_cast<const OrCondition *>(&parent))
- {
- std::string line = Traits::get_keyword();
- for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
- line += Msp::format(" \"%s\"", static_cast<const ChoiceCondition<Traits> *>(*i)->value);
- FilterStatement::add_line(st, line);
- }
+ std::string line = Traits::get_keyword();
+ for(typename std::vector<Type>::const_iterator i=values.begin(); i!=values.end(); ++i)
+ line += Msp::format(" \"%s\"", *i);
+ FilterStatement::add_line(st, line);
}
#endif