diff --git a/src/db/db/dbStreamLayers.cc b/src/db/db/dbStreamLayers.cc index eb1260601..ac2cc9819 100644 --- a/src/db/db/dbStreamLayers.cc +++ b/src/db/db/dbStreamLayers.cc @@ -262,6 +262,43 @@ static std::string format_interval (ld_type l1, ld_type l2) } } +static std::vector > +extract_dt_intervals (const LayerMap::datatype_map &dt_map, int ll, bool &has_others) +{ + std::vector > res; + + for (LayerMap::datatype_map::const_iterator d = dt_map.begin (); d != dt_map.end (); ) { + + if (d->second.find (ll) != d->second.end ()) { + + std::pair dpi = d->first; + + if (d->second.size () > 1) { + has_others = true; + } + + LayerMap::datatype_map::const_iterator dd = d; + ++dd; + while (dd != dt_map.end () && dd->first.first == dpi.second && dd->second.find (ll) != dd->second.end ()) { + if (dd->second.size () > 1) { + has_others = true; + } + dpi.second = dd->first.second; + ++dd; + } + + d = dd; + + res.push_back (dpi); + + } else { + ++d; + } + + } + return res; +} + std::string LayerMap::mapping_str (unsigned int ll) const { @@ -269,36 +306,37 @@ LayerMap::mapping_str (unsigned int ll) const bool f1 = true; bool is_mmap = false; - for (ld_map::const_iterator l = m_ld_map.begin (); l != m_ld_map.end (); ++l) { + for (ld_map::const_iterator l = m_ld_map.begin (); l != m_ld_map.end (); ) { + + std::pair lti = l->first; + + std::vector > dti = extract_dt_intervals (l->second, ll, is_mmap); + ++l; + while (l != m_ld_map.end () && lti.second == l->first.first && extract_dt_intervals (l->second, ll, is_mmap) == dti) { + lti.second = l->first.second; + ++l; + } bool f2 = true; - for (datatype_map::const_iterator d = l->second.begin (); d != l->second.end (); ++d) { + for (std::vector >::const_iterator d = dti.begin (); d != dti.end (); ++d) { - if (d->second.find (ll) != d->second.end ()) { + // create a string representation + if (!f2) { + s += ","; + } else { - if (d->second.size () > 1) { - is_mmap = true; + if (!f1) { + s += ";"; } + f1 = false; - // create a string representation - if (!f2) { - s += ","; - } else { - - if (!f1) { - s += ";"; - } - f1 = false; - - s += format_interval (l->first.first, l->first.second); - s += "/"; - - } - f2 = false; - - s += format_interval (d->first.first, d->first.second); + s += format_interval (lti.first, lti.second); + s += "/"; } + f2 = false; + + s += format_interval (d->first, d->second); } diff --git a/src/db/unit_tests/dbStreamLayerTests.cc b/src/db/unit_tests/dbStreamLayerTests.cc index 6b0b478b0..f031de1f3 100644 --- a/src/db/unit_tests/dbStreamLayerTests.cc +++ b/src/db/unit_tests/dbStreamLayerTests.cc @@ -38,7 +38,7 @@ TEST(1) EXPECT_EQ (lm.first_logical (db::LDPair (2, 0)).second, (unsigned int) 18); EXPECT_EQ (lm.first_logical (db::LDPair (0, 0)).first, false); - EXPECT_EQ (lm.mapping_str (18), "1/0;2-5/0"); + EXPECT_EQ (lm.mapping_str (18), "1-5/0"); EXPECT_EQ (lm.mapping_str (17), "1/5"); lm.map (db::LDPair (2, 2), 18); @@ -477,7 +477,7 @@ TEST(8) // some lm.mmap_expr ("*/1-10", n++); EXPECT_EQ (lm.to_string (), - "layer_map('+*/0,1-10,11-*';'+*/1-10')" + "layer_map('+*/*';'+*/1-10')" ); EXPECT_EQ (db::LayerMap::from_string_file_format (lm.to_string_file_format ()).to_string (), lm.to_string ()); @@ -485,7 +485,7 @@ TEST(8) lm.mmap_expr ("*/5,15", n++); EXPECT_EQ (lm.to_string (), - "layer_map('+*/0,1-4,5,6-10,11-14,15,16-*';'+*/1-4,5,6-10';'+*/5,15')" + "layer_map('+*/*';'+*/1-10';'+*/5,15')" ); EXPECT_EQ (db::LayerMap::from_string_file_format (lm.to_string_file_format ()).to_string (), lm.to_string ()); @@ -496,8 +496,8 @@ TEST(8) EXPECT_EQ (set2string (lm.logical (db::LDPair (0, 10))), "0,1"); // NOTE: the leading "+" indicates that the listed layers may go somewhere else, so we can't plainly map them - EXPECT_EQ (lm.mapping_str (0), "+*/0,1-4,5,6-10,11-14,15,16-*"); - EXPECT_EQ (lm.mapping_str (1), "+*/1-4,5,6-10"); + EXPECT_EQ (lm.mapping_str (0), "+*/*"); + EXPECT_EQ (lm.mapping_str (1), "+*/1-10"); EXPECT_EQ (lm.mapping_str (2), "+*/5,15"); EXPECT_EQ (lm.mapping_str (3), ""); @@ -516,7 +516,7 @@ TEST(8) // some lm.mmap_expr ("1-10/*", n++); EXPECT_EQ (lm.to_string (), - "layer_map('+0/*;1-10/*;11-*/*';'+1-10/*')" + "layer_map('+*/*';'+1-10/*')" ); EXPECT_EQ (db::LayerMap::from_string_file_format (lm.to_string_file_format ()).to_string (), lm.to_string ()); @@ -524,7 +524,7 @@ TEST(8) lm.mmap_expr ("5,15/*", n++); EXPECT_EQ (lm.to_string (), - "layer_map('+0/*;1-4/*;5/*;6-10/*;11-14/*;15/*;16-*/*';'+1-4/*;5/*;6-10/*';'+5/*;15/*')" + "layer_map('+*/*';'+1-10/*';'+5/*;15/*')" ); EXPECT_EQ (db::LayerMap::from_string_file_format (lm.to_string_file_format ()).to_string (), lm.to_string ()); @@ -535,8 +535,8 @@ TEST(8) EXPECT_EQ (set2string (lm.logical (db::LDPair (10, 0))), "0,1"); // NOTE: the leading "+" indicates that the listed layers may go somewhere else, so we can't plainly map them - EXPECT_EQ (lm.mapping_str (0), "+0/*;1-4/*;5/*;6-10/*;11-14/*;15/*;16-*/*"); - EXPECT_EQ (lm.mapping_str (1), "+1-4/*;5/*;6-10/*"); + EXPECT_EQ (lm.mapping_str (0), "+*/*"); + EXPECT_EQ (lm.mapping_str (1), "+1-10/*"); EXPECT_EQ (lm.mapping_str (2), "+5/*;15/*"); EXPECT_EQ (lm.mapping_str (3), ""); @@ -553,7 +553,7 @@ TEST(8) // some lm.mmap_expr ("1-10/0-20", n++); EXPECT_EQ (lm.to_string (), - "layer_map('+0/*;1-10/0-20,21-*;11-*/*';'+1-10/0-20')" + "layer_map('+*/*';'+1-10/0-20')" ); EXPECT_EQ (db::LayerMap::from_string_file_format (lm.to_string_file_format ()).to_string (), lm.to_string ()); } diff --git a/src/lay/lay/doc/about/layer_mapping.xml b/src/lay/lay/doc/about/layer_mapping.xml index 81d6205db..2f3ea4c82 100644 --- a/src/lay/lay/doc/about/layer_mapping.xml +++ b/src/lay/lay/doc/about/layer_mapping.xml @@ -173,5 +173,33 @@ +

Multi-mapping and unmapping

+ +

+ Layer mapping table support an advanced feature which is to duplicate input layers to + a number of output layers (1:n) mapping. + The feature is enabled by prepending a "+" to the mapping statement. The following + statement will first select layer 5/0 and additionally copy it to layer 1000/0: +

+ +
5/0
++5/0: 1000/0
+
+ +

+ Unmapping removes the mapping for a specific layer or range. It is specified by prepending "-" + to the mapping expression. The following statement will map all datatypes of layer 5 to 0 except + for datatype 10 which is not considered. +

+ +
5/*: 5/0
+-5/10
+
+ +

+ Unmapping cancels the mappings specified previously, so the order of statements becomes important + when using unmapping and multi-mapping. +

+