#ifndef CHOICECONDITION_H_
#define CHOICECONDITION_H_
+#include <msp/core/algorithm.h>
#include "condition.h"
#include "filter.h"
virtual ChoiceCondition<T> *clone() const;
virtual bool can_merge(const Condition &, const CompoundCondition &) const;
- virtual ChoiceCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
+ virtual ChoiceCondition<T> *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
virtual void add_lines(std::list<FilterStatement> &) const;
};
}
template<typename T>
-ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
+ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
{
if(dynamic_cast<const OrCondition *>(&parent) && !conditions.empty())
{
- ChoiceCondition<T> *result = 0;
- for(std::vector<Condition *>::const_iterator i=conditions.begin(); ++i!=conditions.end(); )
+ 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<ChoiceCondition<T> *>(*i)->values;
- if(!result)
- result = new ChoiceCondition<T>(v);
- else
- result->values.insert(result->values.end(), v.begin(), v.end());
+ 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;
}