diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index e3e9b8d7c..dfc0c3431 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -32,7 +32,7 @@ namespace db CompoundRegionOperationNode::CompoundRegionOperationNode () : m_dist (0) { - invalidate_cache (); + // .. nothing yet .. } CompoundRegionOperationNode::~CompoundRegionOperationNode () @@ -106,20 +106,20 @@ static void translate (db::Layout *, const std::vector &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionOperationNode::compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > intermediate; intermediate.push_back (std::unordered_set ()); - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, intermediate, max_vertex_count, area_ratio); translate (layout, intermediate, results); } void -CompoundRegionOperationNode::compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionOperationNode::compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > intermediate; intermediate.push_back (std::unordered_set ()); - implement_compute_local (layout, interactions, intermediate, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, intermediate, max_vertex_count, area_ratio); translate (layout, intermediate, results); } @@ -142,14 +142,14 @@ std::vector CompoundRegionOperationPrimaryNode::inputs () const return is; } -void CompoundRegionOperationPrimaryNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::subject_iterator i = interactions.begin_subjects (); i != interactions.end_subjects (); ++i) { results.front ().insert (i->second); } } -void CompoundRegionOperationPrimaryNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationPrimaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::subject_iterator i = interactions.begin_subjects (); i != interactions.end_subjects (); ++i) { results.front ().insert (i->second); @@ -177,14 +177,14 @@ std::vector CompoundRegionOperationSecondaryNode::inputs () const return iv; } -void CompoundRegionOperationSecondaryNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); } } -void CompoundRegionOperationSecondaryNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationSecondaryNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); @@ -211,14 +211,14 @@ std::vector CompoundRegionOperationForeignNode::inputs () const return iv; } -void CompoundRegionOperationForeignNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); } } -void CompoundRegionOperationForeignNode::do_compute_local (db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const +void CompoundRegionOperationForeignNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *, const shape_interactions &interactions, std::vector > &results, size_t, double) const { for (shape_interactions::intruder_iterator i = interactions.begin_intruders (); i != interactions.end_intruders (); ++i) { results.front ().insert (i->second.second); @@ -360,15 +360,6 @@ CompoundRegionMultiInputOperationNode::~CompoundRegionMultiInputOperationNode () // .. nothing yet .. } -void -CompoundRegionMultiInputOperationNode::invalidate_cache () const -{ - CompoundRegionOperationNode::invalidate_cache (); - for (tl::shared_collection::const_iterator i = m_children.begin (); i != m_children.end (); ++i) { - i->invalidate_cache (); - } -} - db::Coord CompoundRegionMultiInputOperationNode::computed_dist () const { @@ -455,7 +446,7 @@ std::string CompoundRegionLogicalBoolOperationNode::generated_description () con } template -void CompoundRegionLogicalBoolOperationNode::implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionLogicalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { bool ok = (m_op == And ? true : false); @@ -468,7 +459,7 @@ void CompoundRegionLogicalBoolOperationNode::implement_compute_local (db::Layout const CompoundRegionOperationNode *node = child (ci); - bool any = node->compute_local_bool (layout, child_interactions, max_vertex_count, area_ratio); + bool any = node->compute_local_bool (cache, layout, child_interactions, max_vertex_count, area_ratio); if (m_op == And) { if (! any) { @@ -752,13 +743,13 @@ static void copy_results (std::vector > &, const std::vect template void -CompoundRegionGeometricalBoolOperationNode::implement_bool (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one_a; one_a.push_back (std::unordered_set ()); shape_interactions computed_a; - child (0)->compute_local (layout, interactions_for_child (interactions, 0, computed_a), one_a, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions_for_child (interactions, 0, computed_a), one_a, max_vertex_count, area_ratio); if (one_a.front ().empty ()) { @@ -772,7 +763,7 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (db::Layout *layout, one_b.push_back (std::unordered_set ()); shape_interactions computed_b; - child (1)->compute_local (layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); + child (1)->compute_local (cache, layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); copy_results (results, one_b); @@ -784,7 +775,7 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (db::Layout *layout, one_b.push_back (std::unordered_set ()); shape_interactions computed_b; - child (1)->compute_local (layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); + child (1)->compute_local (cache, layout, interactions_for_child (interactions, 1, computed_b), one_b, max_vertex_count, area_ratio); if (one_b.front ().empty ()) { @@ -803,44 +794,44 @@ CompoundRegionGeometricalBoolOperationNode::implement_bool (db::Layout *layout, template void -CompoundRegionGeometricalBoolOperationNode::implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { ResultType res_a = child (0)->result_type (); ResultType res_b = child (1)->result_type (); if (res_a == Region && res_b == Region) { - implement_bool (layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); } else if (res_a == Region && res_b == Edges) { - implement_bool (layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); } else if (res_a == Edges && res_b == Region) { - implement_bool (layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); } else if (res_a == Edges && res_b == Edges) { - implement_bool (layout, interactions, results, max_vertex_count, area_ratio); + implement_bool (cache, layout, interactions, results, max_vertex_count, area_ratio); } } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionGeometricalBoolOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionGeometricalBoolOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // --------------------------------------------------------------------------------------------- @@ -909,7 +900,7 @@ namespace template template -void compound_region_generic_operation_node::implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void compound_region_generic_operation_node::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { generic_result_adaptor adaptor (&results); @@ -926,7 +917,7 @@ void compound_region_generic_operation_node::implement_compute_local shape_interactions self_interactions_heap; const shape_interactions &self_interactions = interactions_for_child (interactions, 0, self_interactions_heap); - self->compute_local (layout, self_interactions, self_result, max_vertex_count, area_ratio); + self->compute_local (cache, layout, self_interactions, self_result, max_vertex_count, area_ratio); db::generic_shape_iterator is (self_result.front ().begin (), self_result.front ().end ()); @@ -943,7 +934,7 @@ void compound_region_generic_operation_node::implement_compute_local shape_interactions intruder_interactions_heap; const shape_interactions &intruder_interactions = interactions_for_child (interactions, ci, intruder_interactions_heap); - intruder->compute_local (layout, intruder_interactions, intruder_result, max_vertex_count, area_ratio); + intruder->compute_local (cache, layout, intruder_interactions, intruder_result, max_vertex_count, area_ratio); intruder_results.push_back (std::unordered_set ()); intruder_results.back ().swap (intruder_result.front ()); @@ -959,14 +950,14 @@ void compound_region_generic_operation_node::implement_compute_local } // explicit instantiations -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template DB_PUBLIC void compound_region_generic_operation_node::implement_compute_local (db::CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; // --------------------------------------------------------------------------------------------- @@ -999,7 +990,7 @@ CompoundRegionLogicalCaseSelectOperationNode::result_type () const } template -void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { bool ok = false; @@ -1014,7 +1005,7 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: if (ci + 1 < children ()) { - ok = node->compute_local_bool (layout, child_interactions, max_vertex_count, area_ratio); + ok = node->compute_local_bool (cache, layout, child_interactions, max_vertex_count, area_ratio); continue; } else { @@ -1030,12 +1021,12 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: std::vector > one; one.push_back (std::unordered_set ()); - node->compute_local (layout, child_interactions, one, max_vertex_count, area_ratio); + node->compute_local (cache, layout, child_interactions, one, max_vertex_count, area_ratio); results[ci / 2].swap (one.front ()); } else { - node->compute_local (layout, child_interactions, results, max_vertex_count, area_ratio); + node->compute_local (cache, layout, child_interactions, results, max_vertex_count, area_ratio); } @@ -1047,12 +1038,12 @@ void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db:: } -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionLogicalCaseSelectOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; // --------------------------------------------------------------------------------------------- @@ -1154,24 +1145,24 @@ CompoundRegionJoinOperationNode::result_type () const } template -void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { for (unsigned int ci = 0; ci < children (); ++ci) { shape_interactions computed; const shape_interactions &child_interactions = interactions_for_child (interactions, ci, computed); - child (ci)->compute_local (layout, child_interactions, results, max_vertex_count, area_ratio); + child (ci)->compute_local (cache, layout, child_interactions, results, max_vertex_count, area_ratio); } } -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; -template void CompoundRegionJoinOperationNode::implement_compute_local (db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; +template void CompoundRegionJoinOperationNode::implement_compute_local (CompoundRegionOperationCache *, db::Layout *, const shape_interactions &, std::vector > &, size_t, double) const; // --------------------------------------------------------------------------------------------- @@ -1190,15 +1181,15 @@ CompoundRegionFilterOperationNode::~CompoundRegionFilterOperationNode () } void -CompoundRegionFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // --------------------------------------------------------------------------------------------- @@ -1218,15 +1209,15 @@ CompoundRegionEdgeFilterOperationNode::~CompoundRegionEdgeFilterOperationNode () } void -CompoundRegionEdgeFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgeFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // --------------------------------------------------------------------------------------------- @@ -1246,15 +1237,15 @@ CompoundRegionEdgePairFilterOperationNode::~CompoundRegionEdgePairFilterOperatio } void -CompoundRegionEdgePairFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgePairFilterOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairFilterOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } bool @@ -1280,15 +1271,15 @@ CompoundRegionProcessingOperationNode::~CompoundRegionProcessingOperationNode () } void -CompoundRegionProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void @@ -1324,15 +1315,15 @@ CompoundRegionToEdgeProcessingOperationNode::~CompoundRegionToEdgeProcessingOper } void -CompoundRegionToEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionToEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void @@ -1364,15 +1355,15 @@ CompoundRegionEdgeProcessingOperationNode::~CompoundRegionEdgeProcessingOperatio } void -CompoundRegionEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void CompoundRegionEdgeProcessingOperationNode::processed (db::Layout *, const db::Edge &p, std::vector &res) const @@ -1397,15 +1388,15 @@ CompoundRegionEdgeToPolygonProcessingOperationNode::~CompoundRegionEdgeToPolygon } void -CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgeToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void @@ -1442,15 +1433,15 @@ CompoundRegionToEdgePairProcessingOperationNode::~CompoundRegionToEdgePairProces } void -CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionToEdgePairProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void @@ -1482,15 +1473,15 @@ CompoundRegionEdgePairToPolygonProcessingOperationNode::~CompoundRegionEdgePairT } void -CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToPolygonProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void @@ -1527,15 +1518,15 @@ CompoundRegionEdgePairToEdgeProcessingOperationNode::~CompoundRegionEdgePairToEd } void -CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } void -CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionEdgePairToEdgeProcessingOperationNode::do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // --------------------------------------------------------------------------------------------- @@ -1592,7 +1583,7 @@ CompoundRegionCheckOperationNode::computed_dist () const } void -CompoundRegionCheckOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { db::check_local_operation op (m_check, m_different_polygons, m_has_other, m_is_other_merged, m_options); @@ -1608,7 +1599,7 @@ CompoundRegionCheckOperationNode::do_compute_local (db::Layout *layout, const sh } void -CompoundRegionCheckOperationNode::do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const +CompoundRegionCheckOperationNode::do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { db::check_local_operation op (m_check, m_different_polygons, m_has_other, m_is_other_merged, m_options); diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index c7d285465..178bef4dc 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -48,6 +48,50 @@ inline db::Region *subject_regionptr () { return (db::Region *) 0; } inline db::Region *foreign_regionptr () { return (db::Region *) 1; } inline bool is_subject_regionptr (const db::Region *ptr) { return ptr == subject_regionptr () || ptr == foreign_regionptr (); } +class CompoundRegionOperationNode; + +/** + * @brief A per-node cache for results of the compound operations + * + * This cache is important to avoid duplicate evaluation of the same node in + * a diamond-graph structure of nodes. + */ +class DB_PUBLIC CompoundRegionOperationCache +{ +public: + template + std::pair > *> get (const CompoundRegionOperationNode *node) + { + bool valid = false; + std::vector > *cache = 0; + get_cache (cache, valid, node); + return std::make_pair (valid, cache); + } + +private: + std::map > > m_cache_polyref; + std::map > > m_cache_poly; + std::map > > m_cache_edge; + std::map > > m_cache_edge_pair; + + template + void get_cache_generic (std::map > > &caches, std::vector > *&cache_ptr, bool &valid, const CompoundRegionOperationNode *node) + { + typename std::map > >::iterator c = caches.find (node); + if (c != caches.end ()) { + valid = true; + cache_ptr = &c->second; + } else { + cache_ptr = &caches [node]; + } + } + + void get_cache (std::vector > *&cache_ptr, bool &valid, const CompoundRegionOperationNode *node) { get_cache_generic (m_cache_polyref, cache_ptr, valid, node); } + void get_cache (std::vector > *&cache_ptr, bool &valid, const CompoundRegionOperationNode *node) { get_cache_generic (m_cache_poly, cache_ptr, valid, node); } + void get_cache (std::vector > *&cache_ptr, bool &valid, const CompoundRegionOperationNode *node) { get_cache_generic (m_cache_edge, cache_ptr, valid, node); } + void get_cache (std::vector > *&cache_ptr, bool &valid, const CompoundRegionOperationNode *node) { get_cache_generic (m_cache_edge_pair, cache_ptr, valid, node); } +}; + /** * @brief A node of the compound operation tree * @@ -147,62 +191,62 @@ public: */ virtual bool wants_variants () const { return false; } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - void compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } template - bool compute_local_bool (db::Layout *layout, const shape_interactions &interactions, size_t max_vertex_count, double area_ratio) const + bool compute_local_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, size_t max_vertex_count, double area_ratio) const { if (result_type () == Region) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); return ! res.front ().empty (); } else if (result_type () == Edges) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); return ! res.front ().empty (); } else if (result_type () == EdgePairs) { std::vector > res; res.push_back (std::unordered_set ()); - compute_local (layout, interactions, res, max_vertex_count, area_ratio); + compute_local (cache, layout, interactions, res, max_vertex_count, area_ratio); return ! res.front ().empty (); } else { @@ -210,31 +254,14 @@ public: } } - virtual void invalidate_cache () const - { - m_cache_polyref.clear (); - m_cache_polyref_valid = false; - m_cache_poly.clear (); - m_cache_poly_valid = false; - m_cache_edge.clear (); - m_cache_edge_valid = false; - m_cache_edge_pair.clear (); - m_cache_edge_pair_valid = false; - } - - void setup_cache () const - { - invalidate_cache (); - } - protected: // the different computation slots - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual db::Coord computed_dist () const = 0; @@ -243,44 +270,28 @@ protected: private: std::string m_description; db::Coord m_dist; - mutable std::vector > m_cache_polyref; - mutable bool m_cache_polyref_valid; - mutable std::vector > m_cache_poly; - mutable bool m_cache_poly_valid; - mutable std::vector > m_cache_edge; - mutable bool m_cache_edge_valid; - mutable std::vector > m_cache_edge_pair; - mutable bool m_cache_edge_pair_valid; - - void get_cache (std::vector > *&cache_ptr, bool *&valid) const { cache_ptr = &m_cache_polyref; valid = &m_cache_polyref_valid; } - void get_cache (std::vector > *&cache_ptr, bool *&valid) const { cache_ptr = &m_cache_poly; valid = &m_cache_poly_valid; } - void get_cache (std::vector > *&cache_ptr, bool *&valid) const { cache_ptr = &m_cache_edge; valid = &m_cache_edge_valid; } - void get_cache (std::vector > *&cache_ptr, bool *&valid) const { cache_ptr = &m_cache_edge_pair; valid = &m_cache_edge_pair_valid; } template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { // TODO: confine caching to those nodes which need it. - std::vector > *cache = 0; - bool *valid = 0; - get_cache (cache, valid); + std::pair > *> cp = cache->get (this); - if (! *valid) { + if (! cp.first) { std::vector > uncached_results; uncached_results.resize (results.size ()); - do_compute_local (layout, interactions, uncached_results, max_vertex_count, area_ratio); + do_compute_local (cache, layout, interactions, uncached_results, max_vertex_count, area_ratio); - cache->swap (uncached_results); - *valid = true; + cp.second->swap (uncached_results); } - tl_assert (results.size () == cache->size ()); + tl_assert (results.size () == cp.second->size ()); for (size_t r = 0; r < results.size (); ++r) { - results[r].insert ((*cache)[r].begin (), (*cache)[r].end ()); + results[r].insert ((*cp.second)[r].begin (), (*cp.second)[r].end ()); } } }; @@ -349,14 +360,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } }; class DB_PUBLIC CompoundRegionOperationForeignNode @@ -370,14 +381,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } }; class DB_PUBLIC CompoundRegionOperationSecondaryNode @@ -391,14 +402,14 @@ public: virtual db::Coord computed_dist () const { return 0; } virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: db::Region *mp_input; @@ -445,8 +456,6 @@ public: virtual const TransformationReducer *vars () const; virtual bool wants_variants () const; - virtual void invalidate_cache () const; - protected: bool needs_reduce_interactions (unsigned int child_index) const { @@ -523,28 +532,28 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: LogicalOp m_op; bool m_invert; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; }; @@ -564,34 +573,34 @@ public: } // the different computation slots - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } private: @@ -599,12 +608,12 @@ private: bool m_invert; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); if ((one.front ().size () >= m_min_count && one.front ().size () < m_max_count) != m_invert) { results.front ().insert (one.front ().begin (), one.front ().end ()); @@ -628,22 +637,22 @@ public: virtual db::Coord computed_dist () const; // the different computation slots - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: GeometricalOp m_op; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; template - void implement_bool (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_bool (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; }; template @@ -716,7 +725,7 @@ protected: } template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; private: const db::local_operation *m_op; @@ -736,21 +745,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: typedef db::interacting_local_operation op_type; @@ -765,21 +774,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: db::interacting_with_edge_local_operation m_op; @@ -794,21 +803,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: db::pull_local_operation m_op; @@ -822,21 +831,21 @@ public: std::string generated_description () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: db::pull_with_edge_local_operation m_op; @@ -861,39 +870,39 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } private: template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; }; /** @@ -918,39 +927,39 @@ public: virtual ResultType result_type () const; // the different computation slots - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } private: template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; bool m_multi_layer; }; @@ -966,14 +975,14 @@ public: // specifies the result type virtual ResultType result_type () const { return Region; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -984,12 +993,12 @@ private: bool m_sum_of_set; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); if (m_sum_of_set) { if (mp_filter->selected_set (one.front ())) { @@ -1015,14 +1024,14 @@ public: // specifies the result type virtual ResultType result_type () const { return Edges; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -1033,12 +1042,12 @@ private: bool m_sum_of; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); if (m_sum_of) { if (mp_filter->selected (one.front ())) { @@ -1064,14 +1073,14 @@ public: // specifies the result type virtual ResultType result_type () const { return EdgePairs; } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } virtual const TransformationReducer *vars () const { return mp_filter->vars (); } virtual bool wants_variants () const { return mp_filter->wants_variants (); } @@ -1083,12 +1092,12 @@ private: bool is_selected (const db::EdgePair &p) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { if (is_selected (*p)) { @@ -1113,14 +1122,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: PolygonProcessorBase *mp_proc; bool m_owns_proc; @@ -1130,12 +1139,12 @@ private: void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1185,33 +1194,33 @@ public: return std::string ("merged") + CompoundRegionMultiInputOperationNode::generated_description (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - implement_compute_local (layout, interactions, results, max_vertex_count, area_ratio); + implement_compute_local (cache, layout, interactions, results, max_vertex_count, area_ratio); } // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: bool m_min_coherence; unsigned int m_min_wc; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); db::EdgeProcessor ep; @@ -1250,14 +1259,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: EdgeToPolygonProcessorBase *mp_proc; @@ -1267,12 +1276,12 @@ private: void processed (db::Layout *layout, const db::Edge &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1296,14 +1305,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: EdgeProcessorBase *mp_proc; @@ -1312,12 +1321,12 @@ private: void processed (db::Layout *, const db::Edge &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1341,14 +1350,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: EdgePairToPolygonProcessorBase *mp_proc; @@ -1358,12 +1367,12 @@ private: void processed (db::Layout *layout, const db::EdgePair &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1387,26 +1396,26 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: EdgePairToEdgeProcessorBase *mp_proc; bool m_owns_proc; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1430,14 +1439,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: PolygonToEdgeProcessorBase *mp_proc; @@ -1447,12 +1456,12 @@ private: void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1486,14 +1495,14 @@ public: virtual const TransformationReducer *vars () const { return mp_proc->vars (); } virtual bool wants_variants () const { return mp_proc->wants_variants (); } - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: PolygonToEdgePairProcessorBase *mp_proc; @@ -1503,12 +1512,12 @@ private: void processed (db::Layout *layout, const db::PolygonRef &p, std::vector &res) const; template - void implement_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const + void implement_compute_local (db::CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { std::vector > one; one.push_back (std::unordered_set ()); - child (0)->compute_local (layout, interactions, one, max_vertex_count, area_ratio); + child (0)->compute_local (cache, layout, interactions, one, max_vertex_count, area_ratio); std::vector res; for (typename std::unordered_set::const_iterator p = one.front ().begin (); p != one.front ().end (); ++p) { @@ -1550,14 +1559,14 @@ public: virtual OnEmptyIntruderHint on_empty_intruder_hint () const; virtual db::Coord computed_dist () const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; - virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; + virtual void do_compute_local (CompoundRegionOperationCache *cache, db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const; // non-implemented - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } - virtual void do_compute_local (db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } + virtual void do_compute_local (CompoundRegionOperationCache * /*cache*/, db::Layout * /*layout*/, const shape_interactions & /*interactions*/, std::vector > & /*results*/, size_t /*max_vertex_count*/, double /*area_ratio*/) const { } private: db::EdgeRelationFilter m_check; @@ -1592,8 +1601,8 @@ public: protected: virtual void do_compute_local (db::Layout *layout, const shape_interactions &interactions, std::vector > &results, size_t max_vertex_count, double area_ratio) const { - mp_node->setup_cache (); - mp_node->compute_local (layout, interactions, results, max_vertex_count, area_ratio); + CompoundRegionOperationCache cache; + mp_node->compute_local (&cache, layout, interactions, results, max_vertex_count, area_ratio); } virtual db::Coord dist () const { return mp_node->dist (); }