diff --git a/src/db/db/gsiDeclDbLayout.cc b/src/db/db/gsiDeclDbLayout.cc index 9da66889d..98c40d389 100644 --- a/src/db/db/gsiDeclDbLayout.cc +++ b/src/db/db/gsiDeclDbLayout.cc @@ -128,6 +128,19 @@ size_t hash_value (const db::LayerProperties *l) return std::hfunc (*l); } +static bool log_equal_ext (const db::LayerProperties *lp1, const db::LayerProperties &lp2) +{ + if (lp1->log_equal (lp2)) { + return true; + } + // compare by name as fallback if one argument is named and the other is not + // (this gives a way to look up + if ((lp1->is_named () || lp2.is_named()) && ! lp1->name.empty () && ! lp2.name.empty ()) { + return lp1->name == lp2.name; + } + return false; +} + // since there already exists a "LayerProperties" object, we call this one "LayerInfo" Class decl_LayerInfo ("db", "LayerInfo", gsi::constructor ("new", &ctor_layer_info_default, @@ -194,14 +207,15 @@ Class decl_LayerInfo ("db", "LayerInfo", "\n" "This method was added in version 0.18.\n" ) + - gsi::method ("is_equivalent?", &db::LayerProperties::log_equal, gsi::arg ("b"), + gsi::method_ext ("is_equivalent?", &log_equal_ext, gsi::arg ("b"), "@brief Equivalence of two layer info objects\n" "@return True, if both are equivalent\n" "\n" - "First, layer and datatype are compared. The name is of second order and used only if no layer or datatype is given.\n" + "First, layer and datatype are compared. The name is of second order and used only if no layer or datatype is given " + "for one of the operands.\n" "This is basically a weak comparison that reflects the search preferences.\n" "\n" - "This method was added in version 0.18.\n" + "This method was added in version 0.18 and modified to compare non-named vs. named layers in version 0.28.11.\n" ) + gsi::method_ext ("hash", &hash_value, "@brief Computes a hash value\n" @@ -506,7 +520,7 @@ static tl::Variant find_layer (db::Layout *l, const db::LayerProperties &lp) } else { // if we have a layer with the requested properties already, return this. for (db::Layout::layer_iterator li = l->begin_layers (); li != l->end_layers (); ++li) { - if ((*li).second->log_equal (lp)) { + if (log_equal_ext ((*li).second, lp)) { return tl::Variant ((*li).first); } } @@ -530,7 +544,7 @@ static tl::Variant find_layer3 (db::Layout *l, int ln, int dn, const std::string return find_layer (l, db::LayerProperties (ln, dn, name)); } -static std::vector layer_indices (const db::Layout *l) +static std::vector layer_indexes (const db::Layout *l) { std::vector layers; for (unsigned int i = 0; i < l->layers (); ++i) { @@ -1755,7 +1769,7 @@ Class decl_Layout ("db", "Layout", "\n" "@param layer_index The index of the layer to delete.\n" ) + - gsi::method_ext ("layer_indexes|#layer_indices", &layer_indices, + gsi::method_ext ("layer_indexes|#layer_indices", &layer_indexes, "@brief Gets a list of valid layer's indices\n" "This method returns an array with layer indices representing valid layers.\n" "\n" diff --git a/testdata/ruby/dbLayoutTests1.rb b/testdata/ruby/dbLayoutTests1.rb index fa7c0ebe6..a724b05a6 100644 --- a/testdata/ruby/dbLayoutTests1.rb +++ b/testdata/ruby/dbLayoutTests1.rb @@ -64,16 +64,38 @@ class DBLayoutTests1_TestClass < TestBase assert_equal(l3.anonymous?, false) assert_equal(l3.is_named?, true) assert_equal(l3.is_equivalent?(l2), false) - l3.layer = 1 - l3.datatype = 100 - assert_equal(l3.is_named?, false) - assert_equal(l3.is_equivalent?(l2), true) + assert_equal(l2.is_equivalent?(l3), false) + l4 = RBA::LayerInfo::new(1, 100, "aber") + assert_equal(l4.to_s, "aber (1/100)") + assert_equal(l4.anonymous?, false) + assert_equal(l4.is_named?, false) + assert_equal(l4.is_equivalent?(l2), true) + assert_equal(l2.is_equivalent?(l4), true) + assert_equal(l4.is_equivalent?(l3), true) + assert_equal(l3.is_equivalent?(l4), true) + assert_equal(l4.is_equivalent?(RBA::LayerInfo::new(1, 100, "xyz")), true) + assert_equal(l4.is_equivalent?(RBA::LayerInfo::new(1, 101, "aber")), false) + + l1.assign(l4) - l1.assign(l3) assert_equal(l1.to_s, "aber (1/100)") assert_equal(l1.is_named?, false) - assert_equal(l1.is_equivalent?(l3), true) - assert_equal(l1 == l3, true) + assert_equal(l1.is_equivalent?(l4), true) + assert_equal(l1 == l4, true) + + l1.layer = -1 + l1.datatype = -1 + assert_equal(l1.is_named?, true) + assert_equal(l1.to_s, "aber") + + l1.name = "xyz" + assert_equal(l1.is_named?, true) + assert_equal(l1.to_s, "xyz") + + l1.layer = 100 + l1.datatype = 0 + assert_equal(l1.is_named?, false) + assert_equal(l1.to_s, "xyz (100/0)") end @@ -164,16 +186,44 @@ class DBLayoutTests1_TestClass < TestBase assert_equal(a, nil) a = ly.find_layer(RBA::LayerInfo.new(2, 0)) assert_equal(a, li) + a = ly.find_layer(3, 0, "hallo") + assert_equal(a, nil) li2 = ly.layer("hallo") a = ly.find_layer("hillo") assert_equal(a, nil) a = ly.find_layer("hallo") assert_equal(a, li2) a = ly.find_layer(3, 0, "hallo") - assert_equal(a, nil) + assert_equal(a, li2) a = ly.find_layer(2, 0, "hallo") assert_equal(a, li) + ly = RBA::Layout.new + li = ly.layer(2, 0, "hallo") + a = ly.find_layer(3, 0) + assert_equal(a, nil) + a = ly.find_layer(2, 0) + assert_equal(a, li) + a = ly.find_layer("hallo") + assert_equal(a, li) + a = ly.find_layer(2, 0, "hillo") + assert_equal(a, li) + a = ly.find_layer(1, 0, "hallo") + assert_equal(a, nil) + + ly = RBA::Layout.new + li = ly.layer("hallo") + a = ly.find_layer(3, 0) + assert_equal(a, nil) + a = ly.find_layer(2, 0) + assert_equal(a, nil) + a = ly.find_layer("hallo") + assert_equal(a, li) + a = ly.find_layer(2, 0, "hillo") + assert_equal(a, nil) + a = ly.find_layer(1, 0, "hallo") + assert_equal(a, li) + end def collect(s, l)