diff --git a/src/graph/helper.cc b/src/graph/helper.cc index 695dd180f05eb3e09d0fd4c196b4cad36b1b8443..b01a00f95c34b0542986296d66c7e8eb26244e12 100644 --- a/src/graph/helper.cc +++ b/src/graph/helper.cc @@ -562,10 +562,12 @@ namespace hpp { const Grippers_t& gs; const Objects_t& ohs; CompiledRules_t rules; + CompiledRule::Result defaultAcceptationPolicy; mutable Eigen::MatrixXi rulesCache; Result (const Grippers_t& grippers, const Objects_t& objects, GraphPtr_t g) : - graph (g), nG (grippers.size ()), nOH (0), gs (grippers), ohs (objects) + graph (g), nG (grippers.size ()), nOH (0), gs (grippers), ohs (objects), + defaultAcceptationPolicy (CompiledRule::Refuse) { BOOST_FOREACH (const Object_t& o, objects) { nOH += o.get<1>().size(); @@ -591,12 +593,21 @@ namespace hpp { const std::string& g = gs[i]->name(), h = (idxOH[i] == nOH) ? "" : handle (idxOH[i])->name (); if ((CompiledRule::Result)rulesCache(i, idxOH[i]) == CompiledRule::Undefined) { - CompiledRule::Result status = CompiledRule::Accept; + CompiledRule::Result status = (idxOH[i] == nOH ? CompiledRule::Accept : defaultAcceptationPolicy); for (std::size_t r = 0; r < rules.size(); ++r) { - status = rules[r].check(g,h); - if (status == CompiledRule::Accept) break; - else if (status == CompiledRule::Refuse) break; - status = CompiledRule::Accept; + switch (rules[r].check(g,h)) { + case CompiledRule::Accept: + status = CompiledRule::Accept; + break; // Exit loop + case CompiledRule::Refuse: + status = CompiledRule::Refuse; + break; // Exit loop + case CompiledRule::NoMatch: + continue; // Check next rule + default: + throw std::invalid_argument ("Rules are ill-defined."); + } + break; } rulesCache(i, idxOH[i]) = status; }