]> git.tdb.fi Git - poefilter.git/blobdiff - source/rangecondition.h
Add support for map tier condition
[poefilter.git] / source / rangecondition.h
index ad54e0a0582f6e89cdd3b1834cc06a88aa334e70..7d85125b6dae6392be187bf4932bf14b54f57867 100644 (file)
@@ -20,8 +20,9 @@ public:
        RangeCondition(Type, Type);
 
        virtual RangeCondition<T> *clone() const;
+       virtual bool equals(const Condition &) const;
        virtual bool can_merge(const Condition &, const CompoundCondition &) const;
-       virtual RangeCondition<T> *merge(const std::vector<Condition *> &, const CompoundCondition &) const;
+       virtual RangeCondition<T> *merge(const std::vector<const Condition *> &, const CompoundCondition &) const;
        virtual bool is_viable() const { return min<=max; }
        virtual void add_lines(std::list<FilterStatement> &) const;
 };
@@ -71,6 +72,17 @@ struct DropLevelTraits
 typedef RangeCondition<DropLevelTraits> DropLevelCondition;
 
 
+struct MapTierTraits
+{
+       typedef unsigned Type;
+       static unsigned get_min() { return 1; }
+       static unsigned get_max() { return 17; }
+       static const char *get_keyword() { return "MapTier"; }
+};
+
+typedef RangeCondition<MapTierTraits> MapTierCondition;
+
+
 struct WidthTraits
 {
        typedef unsigned Type;
@@ -133,6 +145,16 @@ RangeCondition<T> *RangeCondition<T>::clone() const
        return new RangeCondition<T>(min, max);
 }
 
+template<typename T>
+bool RangeCondition<T>::equals(const Condition &other) const
+{
+       const RangeCondition<T> *other_range = dynamic_cast<const RangeCondition<T> *>(&other);
+       if(!other_range)
+               return false;
+
+       return (min==other_range->min && max==other_range->max);
+}
+
 template<typename T>
 bool RangeCondition<T>::can_merge(const Condition &other, const CompoundCondition &parent) const
 {
@@ -149,7 +171,7 @@ bool RangeCondition<T>::can_merge(const Condition &other, const CompoundConditio
 }
 
 template<typename T>
-RangeCondition<T> *RangeCondition<T>::merge(const std::vector<Condition *> &conditions, const CompoundCondition &parent) const
+RangeCondition<T> *RangeCondition<T>::merge(const std::vector<const Condition *> &conditions, const CompoundCondition &parent) const
 {
        if(conditions.empty())
                return 0;
@@ -160,9 +182,9 @@ RangeCondition<T> *RangeCondition<T>::merge(const std::vector<Condition *> &cond
                result = new RangeCondition<T>(Traits::get_min(), Traits::get_max());
        else
                result = new RangeCondition<T>(Traits::get_max(), Traits::get_min());
-       for(std::vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
+       for(std::vector<const Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
        {
-               const RangeCondition<T> *c = static_cast<RangeCondition<T> *>(*i);
+               const RangeCondition<T> *c = static_cast<const RangeCondition<T> *>(*i);
                if(intersect)
                {
                        result->min = std::max(result->min, c->min);