]> git.tdb.fi Git - poefilter.git/blobdiff - source/rangecondition.h
Change the minimum value of itemlevel and droplevel to 1
[poefilter.git] / source / rangecondition.h
index d4cc19a7889e460351506628d37c0b89bfdd8a4f..d4d11fa852605bb4f93b13be0e97c14ea5dc8c5c 100644 (file)
@@ -19,7 +19,10 @@ public:
        RangeCondition(Type);
        RangeCondition(Type, Type);
 
-       virtual Condition *clone() const;
+       virtual RangeCondition<T> *clone() const;
+       virtual bool can_merge(const Condition &, const CompoundCondition &) const;
+       virtual RangeCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
+       virtual bool is_viable() const { return min<=max; }
        virtual void add_lines(std::list<FilterStatement> &) const;
 };
 
@@ -49,7 +52,7 @@ typedef RangeCondition<QualityTraits> QualityCondition;
 struct ItemLevelTraits
 {
        typedef unsigned Type;
-       static unsigned get_min() { return 0; }
+       static unsigned get_min() { return 1; }
        static unsigned get_max() { return 100; }
        static const char *get_keyword() { return "ItemLevel"; }
 };
@@ -60,7 +63,7 @@ typedef RangeCondition<ItemLevelTraits> ItemLevelCondition;
 struct DropLevelTraits
 {
        typedef unsigned Type;
-       static unsigned get_min() { return 0; }
+       static unsigned get_min() { return 1; }
        static unsigned get_max() { return 100; }
        static const char *get_keyword() { return "DropLevel"; }
 };
@@ -112,26 +115,50 @@ struct LinkedSocketsTraits
 typedef RangeCondition<LinkedSocketsTraits> LinkedSocketsCondition;
 
 
-template<typename Traits>
-RangeCondition<Traits>::RangeCondition(Type v):
+template<typename T>
+RangeCondition<T>::RangeCondition(Type v):
        min(v),
        max(v)
 { }
 
-template<typename Traits>
-RangeCondition<Traits>::RangeCondition(Type n, Type x):
+template<typename T>
+RangeCondition<T>::RangeCondition(Type n, Type x):
        min(n),
        max(x)
 { }
 
-template<typename Traits>
-Condition *RangeCondition<Traits>::clone() const
+template<typename T>
+RangeCondition<T> *RangeCondition<T>::clone() const
 {
-       return new RangeCondition<Traits>(min, max);
+       return new RangeCondition<T>(min, max);
 }
 
-template<typename Traits>
-void RangeCondition<Traits>::add_lines(std::list<FilterStatement> &st) const
+template<typename T>
+bool RangeCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
+{
+       return dynamic_cast<const RangeCondition<T> *>(&other) && dynamic_cast<const AndCondition *>(&parent);
+}
+
+template<typename T>
+RangeCondition<T> *RangeCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
+{
+       if(dynamic_cast<const AndCondition *>(&parent) && !conditions.empty())
+       {
+               RangeCondition<T> *result = new RangeCondition<T>(Traits::get_min(), Traits::get_max());
+               for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
+               {
+                       const RangeCondition<T> *c = static_cast<RangeCondition<T> *>(*i);
+                       result->min = std::max(result->min, c->min);
+                       result->max = std::min(result->max, c->max);
+               }
+               return result;
+       }
+       else
+               return 0;
+}
+
+template<typename T>
+void RangeCondition<T>::add_lines(std::list<FilterStatement> &st) const
 {
        const char *keyword = Traits::get_keyword();
        if(min==max)