]> git.tdb.fi Git - poefilter.git/blobdiff - source/condition.cpp
Make the helper functions in CompoundCondition static
[poefilter.git] / source / condition.cpp
index 4d00b6c7a75a3c183aca2367fb474deb04615108..6d383eafb278bf6592b1bca5447e1506d56fb541 100644 (file)
@@ -18,14 +18,16 @@ void CompoundCondition::clone_to(CompoundCondition &other) const
 
 void CompoundCondition::add(Condition *cond)
 {
+       if(!cond)
+               throw invalid_argument("CompoundCondition::add");
        conditions.push_back(cond);
 }
 
-const Condition *CompoundCondition::get(unsigned i) const
+const Condition &CompoundCondition::get(unsigned i) const
 {
        if(i>=conditions.size())
                throw out_of_range("CompoundCondition::get");
-       return conditions[i];
+       return *conditions[i];
 }
 
 Condition *CompoundCondition::flatten() const
@@ -40,7 +42,10 @@ Condition *CompoundCondition::flatten() const
                merge = conditions.front()->can_merge(**i, *this);
 
        if(merge)
-               return conditions.front()->merge(conditions, *this);
+       {
+               vector<const Condition *> merge_conds(conditions.begin(), conditions.end());
+               return conditions.front()->merge(merge_conds, *this);
+       }
        else
        {
                Condition *result = 0;
@@ -95,13 +100,12 @@ Condition *CompoundCondition::dispatch_flatten(Condition *cond1, Condition *cond
        throw logic_error("CompoundCondition::dispatch_flatten");
 }
 
-Condition *CompoundCondition::merge_two(Condition *cond1, Condition *cond2, bool del) const
+Condition *CompoundCondition::merge_two(Condition *cond1, Condition *cond2, const CompoundCondition &parent, bool del)
 {
-       vector<Condition *> parts;
-       parts.reserve(2);
-       parts.push_back(cond1);
-       parts.push_back(cond2);
-       Condition *result = cond1->merge(parts, *this);
+       vector<const Condition *> parts(2);
+       parts[0] = cond1;
+       parts[1] = cond2;
+       Condition *result = cond1->merge(parts, parent);
 
        if(del)
        {
@@ -118,13 +122,13 @@ Condition *CompoundCondition::merge_two(Condition *cond1, Condition *cond2, bool
        return result;
 }
 
-Condition *CompoundCondition::add_merged_to(Condition *cond, CompoundCondition *target, bool del) const
+Condition *CompoundCondition::add_merged_to(Condition *cond, CompoundCondition *target, bool del)
 {
        bool merged = false;
        for(vector<Condition *>::iterator i=target->conditions.begin(); i!=target->conditions.end(); ++i)
                if((*i)->can_merge(*cond, *target))
                {
-                       Condition *m = merge_two(cond, *i, false);
+                       Condition *m = merge_two(cond, *i, *target, false);
                        delete *i;
                        if(del)
                                delete cond;
@@ -145,7 +149,7 @@ Condition *CompoundCondition::add_merged_to(Condition *cond, CompoundCondition *
        return target;
 }
 
-Condition *CompoundCondition::merge_contents_to(CompoundCondition *cond, CompoundCondition *target) const
+Condition *CompoundCondition::merge_contents_to(CompoundCondition *cond, CompoundCondition *target)
 {
        for(vector<Condition *>::iterator i=cond->conditions.begin(); i!=cond->conditions.end(); ++i)
                add_merged_to(*i, target, false);
@@ -170,7 +174,7 @@ AndCondition *AndCondition::clone() const
 Condition *AndCondition::flatten(Condition *cond1, Condition *cond2) const
 {
        if(cond1->can_merge(*cond2, *this))
-               return merge_two(cond1, cond2, true);
+               return merge_two(cond1, cond2, *this, true);
 
        AndCondition *result = new AndCondition;
        result->add(cond1);
@@ -193,7 +197,7 @@ Condition *AndCondition::flatten(OrCondition *cond1, Condition *cond2) const
        OrCondition *result = new OrCondition;
        unsigned count = cond1->count();
        for(unsigned i=0; i<count; ++i)
-               if(Condition *sub = dispatch_flatten(cond1->get(i)->clone(), (i+1<count ? cond2->clone() : cond2)))
+               if(Condition *sub = dispatch_flatten(cond1->get(i).clone(), (i+1<count ? cond2->clone() : cond2)))
                        result->add(sub);
        delete cond1;
 
@@ -216,7 +220,7 @@ Condition *AndCondition::flatten(OrCondition *cond1, OrCondition *cond2) const
        OrCondition *result = new OrCondition;
        for(unsigned i=0; i<count1; ++i)
                for(unsigned j=0; j<count2; ++j)
-                       if(Condition *sub = dispatch_flatten(cond1->get(i)->clone(), cond2->get(j)->clone()))
+                       if(Condition *sub = dispatch_flatten(cond1->get(i).clone(), cond2->get(j).clone()))
                                result->add(sub);
 
        delete cond1;
@@ -254,7 +258,7 @@ OrCondition *OrCondition::clone() const
 Condition *OrCondition::flatten(Condition *cond1, Condition *cond2) const
 {
        if(cond1->can_merge(*cond2, *this))
-               return merge_two(cond1, cond2, true);
+               return merge_two(cond1, cond2, *this, true);
 
        OrCondition *result = new OrCondition;
        result->add(cond1);