]> git.tdb.fi Git - poefilter.git/blobdiff - source/condition.cpp
Add equality comparison for conditions
[poefilter.git] / source / condition.cpp
index 6d383eafb278bf6592b1bca5447e1506d56fb541..e9400c4c2721fe07ec4510db2ccb916d96119daa 100644 (file)
@@ -16,6 +16,18 @@ void CompoundCondition::clone_to(CompoundCondition &other) const
                other.add((*i)->clone());
 }
 
+bool CompoundCondition::sub_equals(const CompoundCondition &other) const
+{
+       if(other.count()!=conditions.size())
+               return false;
+
+       for(unsigned i=0; i<conditions.size(); ++i)
+               if(!conditions[i]->equals(other.get(i)))
+                       return false;
+
+       return true;
+}
+
 void CompoundCondition::add(Condition *cond)
 {
        if(!cond)
@@ -171,6 +183,12 @@ AndCondition *AndCondition::clone() const
        return result;
 }
 
+bool AndCondition::equals(const Condition &other) const
+{
+       const AndCondition *other_and = dynamic_cast<const AndCondition *>(&other);
+       return (other_and ? sub_equals(*other_and) : false);
+}
+
 Condition *AndCondition::flatten(Condition *cond1, Condition *cond2) const
 {
        if(cond1->can_merge(*cond2, *this))
@@ -255,6 +273,12 @@ OrCondition *OrCondition::clone() const
        return result;
 }
 
+bool OrCondition::equals(const Condition &other) const
+{
+       const OrCondition *other_or = dynamic_cast<const OrCondition *>(&other);
+       return (other_or ? sub_equals(*other_or) : false);
+}
+
 Condition *OrCondition::flatten(Condition *cond1, Condition *cond2) const
 {
        if(cond1->can_merge(*cond2, *this))
@@ -321,6 +345,23 @@ LinkedColorsCondition *LinkedColorsCondition::clone() const
        return new LinkedColorsCondition(colors);
 }
 
+bool LinkedColorsCondition::equals(const Condition &other) const
+{
+       const LinkedColorsCondition *other_linked = dynamic_cast<const LinkedColorsCondition *>(&other);
+       if(!other_linked)
+               return false;
+
+       for(unsigned i=0; i<7; ++i)
+       {
+               if(colors.colors[i]!=other_linked->colors.colors[i])
+                       return false;
+               if(!colors.colors[i])
+                       break;
+       }
+
+       return true;
+}
+
 void LinkedColorsCondition::add_lines(list<FilterStatement> &st) const
 {
        FilterStatement::add_line(st, format("SocketGroup %s", colors.colors));