]> git.tdb.fi Git - poefilter.git/blobdiff - source/choicecondition.h
Tighten some parameters and return values
[poefilter.git] / source / choicecondition.h
index df4dacfd5c3e10f5e78abf9ad558f3e2e73a3b37..9792f64c42f012963933b794ca09cba09acee6c7 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef CHOICECONDITION_H_
 #define CHOICECONDITION_H_
 
+#include <msp/core/algorithm.h>
 #include "condition.h"
 #include "filter.h"
 
@@ -12,15 +13,16 @@ public:
        typedef typename Traits::Type Type;
 
 private:
-       Type value;
+       std::vector<Type> values;
 
 public:
        ChoiceCondition(Type);
+       ChoiceCondition(const std::vector<Type> &);
 
-       virtual Condition *clone() const;
+       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;
 };
 
 
@@ -42,40 +44,55 @@ struct BaseTypeTraits
 typedef ChoiceCondition<BaseTypeTraits> BaseTypeCondition;
 
 
-template<typename Traits>
-ChoiceCondition<Traits>::ChoiceCondition(Type v):
-       value(v)
-{ }
-
-template<typename Traits>
-Condition *ChoiceCondition<Traits>::clone() const
+template<typename T>
+ChoiceCondition<T>::ChoiceCondition(Type v)
 {
-       return new ChoiceCondition<Traits>(value);
+       values.push_back(v);
 }
 
-template<typename Traits>
-bool ChoiceCondition<Traits>::can_merge(const Condition &other, const CompoundCondition &parent) const
+template<typename T>
+ChoiceCondition<T>::ChoiceCondition(const std::vector<Type> &v):
+       values(v)
+{ }
+
+template<typename T>
+ChoiceCondition<T> *ChoiceCondition<T>::clone() const
 {
-       return dynamic_cast<const ChoiceCondition<Traits> *>(&other) && dynamic_cast<const OrCondition *>(&parent);
+       return new ChoiceCondition<T>(values);
 }
 
-template<typename Traits>
-void ChoiceCondition<Traits>::add_lines(std::list<FilterStatement> &st) const
+template<typename T>
+bool ChoiceCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
 {
-       const char *keyword = Traits::get_keyword();
-       FilterStatement::add_line(st, Msp::format("%s \"%s\"", keyword, value));
+       return dynamic_cast<const ChoiceCondition<T> *>(&other) && dynamic_cast<const OrCondition *>(&parent);
 }
 
-template<typename Traits>
-void ChoiceCondition<Traits>::add_merged_lines(const std::vector<Condition *> &conditions, const CompoundCondition &parent, std::list<FilterStatement> &st) const
+template<typename T>
+ChoiceCondition<T> *ChoiceCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
 {
-       if(dynamic_cast<const OrCondition *>(&parent))
+       if(dynamic_cast<const OrCondition *>(&parent) && !conditions.empty())
        {
-               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);
+               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_lines(std::list<FilterStatement> &st) const
+{
+       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