@@ -375,18 +375,24 @@ EdgePairsDelegate *
375375DeepEdgePairs::filter_in_place (const EdgePairFilterBase &filter)
376376{
377377 // TODO: implement to be really in-place
378- *this = *apply_filter (filter) ;
378+ *this = *apply_filter (filter, true , false ). first ;
379379 return this ;
380380}
381381
382382EdgePairsDelegate *
383383DeepEdgePairs::filtered (const EdgePairFilterBase &filter) const
384384{
385- return apply_filter (filter) ;
385+ return apply_filter (filter, true , false ). first ;
386386}
387387
388- DeepEdgePairs *
389- DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
388+ std::pair<EdgePairsDelegate *, EdgePairsDelegate *>
389+ DeepEdgePairs::filtered_pair (const EdgePairFilterBase &filter) const
390+ {
391+ return apply_filter (filter, true , true );
392+ }
393+
394+ std::pair<DeepEdgePairs *, DeepEdgePairs *>
395+ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter, bool with_true, bool with_false) const
390396{
391397 const db::DeepLayer &edge_pairs = deep_layer ();
392398 db::Layout &layout = const_cast <db::Layout &> (edge_pairs.layout ());
@@ -404,9 +410,10 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
404410
405411 }
406412
407- std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit ;
413+ std::map<db::cell_index_type, std::map<db::ICplxTrans, db::Shapes> > to_commit_true, to_commit_false ;
408414
409- std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (edge_pairs.derived ()));
415+ std::unique_ptr<db::DeepEdgePairs> res_true (with_true ? new db::DeepEdgePairs (edge_pairs.derived ()) : 0 );
416+ std::unique_ptr<db::DeepEdgePairs> res_false (with_false ? new db::DeepEdgePairs (edge_pairs.derived ()) : 0 );
410417 for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) {
411418
412419 const db::Shapes &s = c->shapes (edge_pairs.layer ());
@@ -416,42 +423,70 @@ DeepEdgePairs::apply_filter (const EdgePairFilterBase &filter) const
416423 const std::set<db::ICplxTrans> &vv = vars->variants (c->cell_index ());
417424 for (auto v = vv.begin (); v != vv.end (); ++v) {
418425
419- db::Shapes *st ;
426+ db::Shapes *st_true = 0 , *st_false = 0 ;
420427 if (vv.size () == 1 ) {
421- st = & c->shapes (res->deep_layer ().layer ());
428+ if (with_true) {
429+ st_true = & c->shapes (res_true->deep_layer ().layer ());
430+ }
431+ if (with_false) {
432+ st_false = & c->shapes (res_false->deep_layer ().layer ());
433+ }
422434 } else {
423- st = & to_commit [c->cell_index ()] [*v];
435+ if (with_true) {
436+ st_true = & to_commit_true [c->cell_index ()] [*v];
437+ }
438+ if (with_false) {
439+ st_false = & to_commit_false [c->cell_index ()] [*v];
440+ }
424441 }
425442
426443 const db::ICplxTrans &tr = *v;
427444
428445 for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::EdgePairs); ! si.at_end (); ++si) {
429446 if (filter.selected (si->edge_pair ().transformed (tr))) {
430- st->insert (*si);
447+ if (st_true) {
448+ st_true->insert (*si);
449+ }
450+ } else {
451+ if (st_false) {
452+ st_false->insert (*si);
453+ }
431454 }
432455 }
433456
434457 }
435458
436459 } else {
437460
438- db::Shapes &st = c->shapes (res->deep_layer ().layer ());
461+ db::Shapes *st_true = with_true ? &c->shapes (res_true->deep_layer ().layer ()) : 0 ;
462+ db::Shapes *st_false = with_false ? &c->shapes (res_false->deep_layer ().layer ()) : 0 ;
439463
440464 for (db::Shapes::shape_iterator si = s.begin (db::ShapeIterator::EdgePairs); ! si.at_end (); ++si) {
441465 if (filter.selected (si->edge_pair ())) {
442- st.insert (*si);
466+ if (with_true) {
467+ st_true->insert (*si);
468+ }
469+ } else {
470+ if (with_false) {
471+ st_false->insert (*si);
472+ }
443473 }
444474 }
445475
446476 }
447477
448478 }
449479
450- if (! to_commit.empty () && vars.get ()) {
451- vars->commit_shapes (res->deep_layer ().layer (), to_commit);
480+ if (! to_commit_true.empty () && vars.get ()) {
481+ tl_assert (res_true.get () != 0 );
482+ vars->commit_shapes (res_true->deep_layer ().layer (), to_commit_true);
483+ }
484+ if (! to_commit_false.empty () && vars.get ()) {
485+ tl_assert (res_false.get () != 0 );
486+ vars->commit_shapes (res_false->deep_layer ().layer (), to_commit_false);
452487 }
453488
454- return res .release ();
489+ return std::make_pair (res_true .release (), res_false. release () );
455490}
456491
457492EdgePairsDelegate *DeepEdgePairs::process_in_place (const EdgePairProcessorBase &filter)
0 commit comments