]> git.tdb.fi Git - poefilter.git/blobdiff - source/rangecondition.h
Add equality comparison for conditions
[poefilter.git] / source / rangecondition.h
index ad54e0a0582f6e89cdd3b1834cc06a88aa334e70..811a1aa48ffba85371d04249ef0ce0eef0f4cb36 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;
 };
@@ -133,6 +134,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 +160,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 +171,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);