X-Git-Url: http://git.tdb.fi/?p=poefilter.git;a=blobdiff_plain;f=source%2Fcondition.cpp;h=1ff316c361f76f51d6f0c13db000cd21a4b621f1;hp=4d00b6c7a75a3c183aca2367fb474deb04615108;hb=746329e61ac9f26962af740b0b11dee716803521;hpb=3169efbcaa882c427d9cc1bbb6dbd187efe98f45 diff --git a/source/condition.cpp b/source/condition.cpp index 4d00b6c..1ff316c 100644 --- a/source/condition.cpp +++ b/source/condition.cpp @@ -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 merge_conds(conditions.begin(), conditions.end()); + return conditions.front()->merge(merge_conds, *this); + } else { Condition *result = 0; @@ -97,10 +102,9 @@ Condition *CompoundCondition::dispatch_flatten(Condition *cond1, Condition *cond Condition *CompoundCondition::merge_two(Condition *cond1, Condition *cond2, bool del) const { - vector parts; - parts.reserve(2); - parts.push_back(cond1); - parts.push_back(cond2); + vector parts(2); + parts[0] = cond1; + parts[1] = cond2; Condition *result = cond1->merge(parts, *this); if(del) @@ -193,7 +197,7 @@ Condition *AndCondition::flatten(OrCondition *cond1, Condition *cond2) const OrCondition *result = new OrCondition; unsigned count = cond1->count(); for(unsigned i=0; iget(i)->clone(), (i+1clone() : cond2))) + if(Condition *sub = dispatch_flatten(cond1->get(i).clone(), (i+1clone() : 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; iget(i)->clone(), cond2->get(j)->clone())) + if(Condition *sub = dispatch_flatten(cond1->get(i).clone(), cond2->get(j).clone())) result->add(sub); delete cond1;