mirror of https://github.com/KLayout/klayout.git
WIP
This commit is contained in:
parent
128a00896e
commit
c6a097ae61
|
|
@ -35,7 +35,12 @@ namespace db
|
||||||
|
|
||||||
const tl::Variant &property_name (db::property_names_id_type id)
|
const tl::Variant &property_name (db::property_names_id_type id)
|
||||||
{
|
{
|
||||||
|
if (id == 0) {
|
||||||
|
static tl::Variant nil;
|
||||||
|
return nil;
|
||||||
|
} else {
|
||||||
return *(reinterpret_cast <const tl::Variant *> (id));
|
return *(reinterpret_cast <const tl::Variant *> (id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db::property_names_id_type property_names_id (const tl::Variant &pn)
|
db::property_names_id_type property_names_id (const tl::Variant &pn)
|
||||||
|
|
@ -45,7 +50,12 @@ db::property_names_id_type property_names_id (const tl::Variant &pn)
|
||||||
|
|
||||||
const tl::Variant &property_value (db::property_values_id_type id)
|
const tl::Variant &property_value (db::property_values_id_type id)
|
||||||
{
|
{
|
||||||
|
if (id == 0) {
|
||||||
|
static tl::Variant nil;
|
||||||
|
return nil;
|
||||||
|
} else {
|
||||||
return *(reinterpret_cast <const tl::Variant *> (id));
|
return *(reinterpret_cast <const tl::Variant *> (id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db::property_values_id_type property_values_id (const tl::Variant &pv)
|
db::property_values_id_type property_values_id (const tl::Variant &pv)
|
||||||
|
|
@ -55,7 +65,12 @@ db::property_values_id_type property_values_id (const tl::Variant &pv)
|
||||||
|
|
||||||
const PropertiesSet &properties (db::properties_id_type id)
|
const PropertiesSet &properties (db::properties_id_type id)
|
||||||
{
|
{
|
||||||
|
if (id == 0) {
|
||||||
|
static db::PropertiesSet empty;
|
||||||
|
return empty;
|
||||||
|
} else {
|
||||||
return *(reinterpret_cast <const PropertiesSet *> (id));
|
return *(reinterpret_cast <const PropertiesSet *> (id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db::properties_id_type properties_id (const PropertiesSet &ps)
|
db::properties_id_type properties_id (const PropertiesSet &ps)
|
||||||
|
|
@ -128,7 +143,7 @@ PropertiesSet::value (const tl::Variant &name) const
|
||||||
{
|
{
|
||||||
db::property_names_id_type nid = db::property_names_id (name);
|
db::property_names_id_type nid = db::property_names_id (name);
|
||||||
auto i = m_map.find (nid);
|
auto i = m_map.find (nid);
|
||||||
if (i == m_map.end () || i->second != nid) {
|
if (i == m_map.end () || i->first != nid) {
|
||||||
static tl::Variant nil;
|
static tl::Variant nil;
|
||||||
return nil;
|
return nil;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -140,7 +155,7 @@ const tl::Variant &
|
||||||
PropertiesSet::value (db::property_names_id_type nid) const
|
PropertiesSet::value (db::property_names_id_type nid) const
|
||||||
{
|
{
|
||||||
auto i = m_map.find (nid);
|
auto i = m_map.find (nid);
|
||||||
if (i == m_map.end () || i->second != nid) {
|
if (i == m_map.end () || i->first != nid) {
|
||||||
static tl::Variant nil;
|
static tl::Variant nil;
|
||||||
return nil;
|
return nil;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -159,20 +174,26 @@ PropertiesSet::erase (const tl::Variant &name)
|
||||||
{
|
{
|
||||||
db::property_names_id_type nid = db::property_names_id (name);
|
db::property_names_id_type nid = db::property_names_id (name);
|
||||||
auto i = m_map.find (nid);
|
auto i = m_map.find (nid);
|
||||||
while (i != m_map.end () && i->second == nid) {
|
auto ii = i;
|
||||||
m_map.erase (nid);
|
while (i != m_map.end () && i->first == nid) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
if (i != ii) {
|
||||||
|
m_map.erase (ii, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
PropertiesSet::erase (db::property_names_id_type nid)
|
PropertiesSet::erase (db::property_names_id_type nid)
|
||||||
{
|
{
|
||||||
auto i = m_map.find (nid);
|
auto i = m_map.find (nid);
|
||||||
while (i != m_map.end () && i->second == nid) {
|
auto ii = i;
|
||||||
m_map.erase (nid);
|
while (i != m_map.end () && i->first == nid) {
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
if (i != ii) {
|
||||||
|
m_map.erase (ii, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -224,10 +245,11 @@ tl::Variant
|
||||||
PropertiesSet::to_list_var () const
|
PropertiesSet::to_list_var () const
|
||||||
{
|
{
|
||||||
tl::Variant var = tl::Variant::empty_list ();
|
tl::Variant var = tl::Variant::empty_list ();
|
||||||
for (auto i = m_map.begin (); i != m_map.end (); ++i) {
|
auto map = to_map ();
|
||||||
|
for (auto i = map.begin (); i != map.end (); ++i) {
|
||||||
tl::Variant el = tl::Variant::empty_list ();
|
tl::Variant el = tl::Variant::empty_list ();
|
||||||
el.push (db::property_name (i->first));
|
el.push (i->first);
|
||||||
el.push (db::property_value (i->second));
|
el.push (i->second);
|
||||||
var.push (el);
|
var.push (el);
|
||||||
}
|
}
|
||||||
return var;
|
return var;
|
||||||
|
|
@ -344,7 +366,7 @@ PropertiesRepository::properties_id (const PropertiesSet &props)
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
pid = db::properties_id (**pi);
|
pid = db::properties_id_type (*pi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -360,14 +360,6 @@ public:
|
||||||
*/
|
*/
|
||||||
properties_id_type properties_id (const PropertiesSet &props);
|
properties_id_type properties_id (const PropertiesSet &props);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Associate a properties set with a properties Id
|
|
||||||
*
|
|
||||||
* This method will return the properties set associated with the given Id.
|
|
||||||
* Id 0 always delivers an empty property set.
|
|
||||||
*/
|
|
||||||
const PropertiesSet &properties (properties_id_type id) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Determine if the given ID is a valid properties ID
|
* @brief Determine if the given ID is a valid properties ID
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -118,8 +118,8 @@ TEST(BasicPropertySetsInRepository)
|
||||||
EXPECT_EQ (id1, id1_copy);
|
EXPECT_EQ (id1, id1_copy);
|
||||||
EXPECT_EQ (id2, id2_copy);
|
EXPECT_EQ (id2, id2_copy);
|
||||||
|
|
||||||
EXPECT_EQ (rep.properties (id1) == set1, true);
|
EXPECT_EQ (db::properties (id1) == set1, true);
|
||||||
EXPECT_EQ (rep.properties (id2) == set2, true);
|
EXPECT_EQ (db::properties (id2) == set2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PropertySets)
|
TEST(PropertySets)
|
||||||
|
|
@ -151,14 +151,14 @@ TEST(PropertySets)
|
||||||
EXPECT_EQ (ps1 [tl::Variant ("x")].is_nil (), true);
|
EXPECT_EQ (ps1 [tl::Variant ("x")].is_nil (), true);
|
||||||
EXPECT_EQ (ps1 == ps2, false);
|
EXPECT_EQ (ps1 == ps2, false);
|
||||||
EXPECT_EQ (ps1 != ps2, true);
|
EXPECT_EQ (ps1 != ps2, true);
|
||||||
EXPECT_EQ (ps1 < ps2, true);
|
EXPECT_EQ (ps1 < ps2, false);
|
||||||
EXPECT_EQ (ps2 < ps1, false);
|
EXPECT_EQ (ps2 < ps1, true);
|
||||||
|
|
||||||
ps2.swap (ps1);
|
ps2.swap (ps1);
|
||||||
EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true);
|
EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true);
|
||||||
EXPECT_EQ (ps2.value (tl::Variant (17)).to_string (), "value");
|
EXPECT_EQ (ps2.value (tl::Variant (17)).to_string (), "value");
|
||||||
|
|
||||||
ps2 = ps1;
|
ps1 = ps2;
|
||||||
EXPECT_EQ (ps1.value (tl::Variant (17)).to_string (), "value");
|
EXPECT_EQ (ps1.value (tl::Variant (17)).to_string (), "value");
|
||||||
EXPECT_EQ (ps1.value (tl::Variant ("x")).is_nil (), true);
|
EXPECT_EQ (ps1.value (tl::Variant ("x")).is_nil (), true);
|
||||||
EXPECT_EQ (ps1 == ps2, true);
|
EXPECT_EQ (ps1 == ps2, true);
|
||||||
|
|
@ -187,7 +187,7 @@ TEST(PropertySetsMerge)
|
||||||
|
|
||||||
ps1.merge (ps2);
|
ps1.merge (ps2);
|
||||||
|
|
||||||
EXPECT_EQ (ps1.to_dict_var ().to_string (), "...");
|
EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PropertySetsConversions)
|
TEST(PropertySetsConversions)
|
||||||
|
|
@ -198,8 +198,8 @@ TEST(PropertySetsConversions)
|
||||||
ps1.insert (tl::Variant (17), tl::Variant ("value"));
|
ps1.insert (tl::Variant (17), tl::Variant ("value"));
|
||||||
ps1.insert (tl::Variant ("x"), tl::Variant (42));
|
ps1.insert (tl::Variant ("x"), tl::Variant (42));
|
||||||
|
|
||||||
EXPECT_EQ (ps1.to_dict_var ().to_string (), "...");
|
EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42");
|
||||||
EXPECT_EQ (ps1.to_list_var ().to_string (), "...");
|
EXPECT_EQ (ps1.to_list_var ().to_string (), "17,value,x,42");
|
||||||
|
|
||||||
auto ps1_map = ps1.to_map ();
|
auto ps1_map = ps1.to_map ();
|
||||||
EXPECT_EQ (ps1_map.size (), size_t (2));
|
EXPECT_EQ (ps1_map.size (), size_t (2));
|
||||||
|
|
@ -229,36 +229,36 @@ TEST(PropertiesTranslator)
|
||||||
ps.insert (key1, 100);
|
ps.insert (key1, 100);
|
||||||
ps.insert (key2, 101);
|
ps.insert (key2, 101);
|
||||||
db::properties_id_type prop1a = rp.properties_id (ps);
|
db::properties_id_type prop1a = rp.properties_id (ps);
|
||||||
EXPECT_EQ (db::prop2string (prop1a), "1=100\n2=101");
|
EXPECT_EQ (db::prop2string (prop1a), "1=>100,2=>101");
|
||||||
|
|
||||||
ps.clear ();
|
ps.clear ();
|
||||||
ps.insert (key1, 0);
|
ps.insert (key1, 0);
|
||||||
ps.insert (key2, 101);
|
ps.insert (key2, 101);
|
||||||
db::properties_id_type prop1b = rp.properties_id (ps);
|
db::properties_id_type prop1b = rp.properties_id (ps);
|
||||||
EXPECT_EQ (db::prop2string (prop1b), "1=0\n2=101");
|
EXPECT_EQ (db::prop2string (prop1b), "1=>0,2=>101");
|
||||||
|
|
||||||
ps.clear ();
|
ps.clear ();
|
||||||
ps.insert (key1, 100);
|
ps.insert (key1, 100);
|
||||||
ps.insert (key3, 102);
|
ps.insert (key3, 102);
|
||||||
db::properties_id_type prop2 = rp.properties_id (ps);
|
db::properties_id_type prop2 = rp.properties_id (ps);
|
||||||
EXPECT_EQ (db::prop2string (prop2), "1=100\n3=102");
|
EXPECT_EQ (db::prop2string (prop2), "1=>100,3=>102");
|
||||||
|
|
||||||
ps.clear ();
|
ps.clear ();
|
||||||
ps.insert (key1, 100);
|
ps.insert (key1, 100);
|
||||||
db::properties_id_type prop3 = rp.properties_id (ps);
|
db::properties_id_type prop3 = rp.properties_id (ps);
|
||||||
EXPECT_EQ (db::prop2string (prop3), "1=100");
|
EXPECT_EQ (db::prop2string (prop3), "1=>100");
|
||||||
|
|
||||||
db::PropertiesTranslator t;
|
db::PropertiesTranslator t;
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
|
||||||
|
|
||||||
t = db::PropertiesTranslator::make_pass_all ();
|
t = db::PropertiesTranslator::make_pass_all ();
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
|
||||||
|
|
||||||
t = db::PropertiesTranslator::make_remove_all ();
|
t = db::PropertiesTranslator::make_remove_all ();
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
||||||
|
|
@ -269,36 +269,36 @@ TEST(PropertiesTranslator)
|
||||||
std::set<tl::Variant> kf;
|
std::set<tl::Variant> kf;
|
||||||
kf.insert (1);
|
kf.insert (1);
|
||||||
t = db::PropertiesTranslator::make_filter (kf, rp);
|
t = db::PropertiesTranslator::make_filter (kf, rp);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
|
||||||
|
|
||||||
kf.insert (3);
|
kf.insert (3);
|
||||||
t = db::PropertiesTranslator::make_filter (kf, rp);
|
t = db::PropertiesTranslator::make_filter (kf, rp);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
|
||||||
|
|
||||||
std::map<tl::Variant, tl::Variant> km;
|
std::map<tl::Variant, tl::Variant> km;
|
||||||
km[1] = 4;
|
km[1] = 4;
|
||||||
km[3] = 1;
|
km[3] = 1;
|
||||||
|
|
||||||
t = db::PropertiesTranslator::make_key_mapper (km, rp);
|
t = db::PropertiesTranslator::make_key_mapper (km, rp);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "4=100");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "4=0");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=102\n4=100");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102,4=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "4=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
|
||||||
|
|
||||||
kf.clear ();
|
kf.clear ();
|
||||||
kf.insert (4);
|
kf.insert (4);
|
||||||
t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp);
|
t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp);
|
||||||
EXPECT_EQ (t.is_empty (), false);
|
EXPECT_EQ (t.is_empty (), false);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "4=100");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "4=0");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "4=100");
|
EXPECT_EQ (db::prop2string (t (prop2)), "4=>100");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "4=100");
|
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
|
||||||
|
|
||||||
kf.clear ();
|
kf.clear ();
|
||||||
kf.insert (3);
|
kf.insert (3);
|
||||||
|
|
@ -314,7 +314,7 @@ TEST(PropertiesTranslator)
|
||||||
EXPECT_EQ (t.is_empty (), false);
|
EXPECT_EQ (t.is_empty (), false);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=102");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "");
|
EXPECT_EQ (db::prop2string (t (prop3)), "");
|
||||||
|
|
||||||
t = db::PropertiesTranslator::make_key_mapper (km, rp);
|
t = db::PropertiesTranslator::make_key_mapper (km, rp);
|
||||||
|
|
@ -330,6 +330,6 @@ TEST(PropertiesTranslator)
|
||||||
EXPECT_EQ (t.is_empty (), false);
|
EXPECT_EQ (t.is_empty (), false);
|
||||||
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
EXPECT_EQ (db::prop2string (t (prop1a)), "");
|
||||||
EXPECT_EQ (db::prop2string (t (prop1b)), "");
|
EXPECT_EQ (db::prop2string (t (prop1b)), "");
|
||||||
EXPECT_EQ (db::prop2string (t (prop2)), "1=102");
|
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102");
|
||||||
EXPECT_EQ (db::prop2string (t (prop3)), "");
|
EXPECT_EQ (db::prop2string (t (prop3)), "");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue