mirror of https://github.com/KLayout/klayout.git
Consistently differenting between double and int values as property keys (otherwise there may be a confusing mix present in the property repository)
This commit is contained in:
parent
4773bb3227
commit
8a5e83bf5d
|
|
@ -462,24 +462,16 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct CompareNamePtrByValueForValues
|
struct CompareVariantPtrByValue
|
||||||
{
|
{
|
||||||
bool operator() (const tl::Variant *a, const tl::Variant *b) const
|
bool operator() (const tl::Variant *a, const tl::Variant *b) const
|
||||||
{
|
{
|
||||||
// NOTE: for values, the type should matter, so 2.0 is different from 2 (integer).
|
// NOTE: for values and names, the type should matter, so 2.0 is different from 2 (integer).
|
||||||
// Hence we use "less" here.
|
// Hence we use "less" here.
|
||||||
return a->less (*b);
|
return a->less (*b);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CompareNamePtrByValueForNames
|
|
||||||
{
|
|
||||||
bool operator() (const tl::Variant *a, const tl::Variant *b) const
|
|
||||||
{
|
|
||||||
return *a < *b;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ComparePropertiesPtrByValue
|
struct ComparePropertiesPtrByValue
|
||||||
{
|
{
|
||||||
bool operator() (const PropertiesSet *a, const PropertiesSet *b) const
|
bool operator() (const PropertiesSet *a, const PropertiesSet *b) const
|
||||||
|
|
@ -488,9 +480,9 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
std::set <const tl::Variant *, CompareNamePtrByValueForNames> m_propnames;
|
std::set <const tl::Variant *, CompareVariantPtrByValue> m_propnames;
|
||||||
std::list <tl::Variant> m_property_names_heap;
|
std::list <tl::Variant> m_property_names_heap;
|
||||||
std::set <const tl::Variant *, CompareNamePtrByValueForValues> m_propvalues;
|
std::set <const tl::Variant *, CompareVariantPtrByValue> m_propvalues;
|
||||||
std::list <tl::Variant> m_property_values_heap;
|
std::list <tl::Variant> m_property_values_heap;
|
||||||
std::set <const PropertiesSet *, ComparePropertiesPtrByValue> m_properties;
|
std::set <const PropertiesSet *, ComparePropertiesPtrByValue> m_properties;
|
||||||
std::list <PropertiesSet> m_properties_heap;
|
std::list <PropertiesSet> m_properties_heap;
|
||||||
|
|
|
||||||
|
|
@ -472,3 +472,34 @@ TEST(PropertiesSetHash)
|
||||||
EXPECT_EQ (ps2.hash (), h1);
|
EXPECT_EQ (ps2.hash (), h1);
|
||||||
EXPECT_EQ (db::hash_for_properties_id (rp.properties_id (ps2)), h1);
|
EXPECT_EQ (db::hash_for_properties_id (rp.properties_id (ps2)), h1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(SameValueDifferentTypes)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
db::PropertiesRepository rp;
|
||||||
|
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
db::PropertiesRepository rp;
|
||||||
|
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_value (rp.prop_value_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((double) 5)).to_parsable_string (), "##5");
|
||||||
|
EXPECT_EQ (db::property_name (rp.prop_name_id ((int) 5)).to_parsable_string (), "#5");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1151,6 +1151,8 @@ normalized_types (Variant::type type1, Variant::type type2)
|
||||||
type2 = Variant::t_double;
|
type2 = Variant::t_double;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ruby sometimes produces byte arrays instead of strings, so use those
|
||||||
|
// as common type for strings and byte arrays
|
||||||
if (is_string_type (type1) && type2 == Variant::t_bytearray) {
|
if (is_string_type (type1) && type2 == Variant::t_bytearray) {
|
||||||
type1 = Variant::t_bytearray;
|
type1 = Variant::t_bytearray;
|
||||||
} else if (is_string_type (type2) && type1 == Variant::t_bytearray) {
|
} else if (is_string_type (type2) && type1 == Variant::t_bytearray) {
|
||||||
|
|
@ -1174,6 +1176,14 @@ normalized_type_rigid (Variant::type type1, Variant::type type2)
|
||||||
type1 = normalized_type (type1);
|
type1 = normalized_type (type1);
|
||||||
type2 = normalized_type (type2);
|
type2 = normalized_type (type2);
|
||||||
|
|
||||||
|
// Ruby sometimes produces byte arrays instead of strings, so use those
|
||||||
|
// as common type for strings and byte arrays
|
||||||
|
if (is_string_type (type1) && type2 == Variant::t_bytearray) {
|
||||||
|
type1 = Variant::t_bytearray;
|
||||||
|
} else if (is_string_type (type2) && type1 == Variant::t_bytearray) {
|
||||||
|
type2 = Variant::t_bytearray;
|
||||||
|
}
|
||||||
|
|
||||||
return std::make_pair (type1 == type2, type1);
|
return std::make_pair (type1 == type2, type1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1144,11 +1144,11 @@ class DBLayoutTest(unittest.TestCase):
|
||||||
shape = s
|
shape = s
|
||||||
self.assertEqual(shape.property(2), "hello, world")
|
self.assertEqual(shape.property(2), "hello, world")
|
||||||
self.assertEqual(shape.property("2"), None)
|
self.assertEqual(shape.property("2"), None)
|
||||||
self.assertEqual(shape.property(2.0), "hello, world")
|
self.assertEqual(shape.property(2.0), None)
|
||||||
self.assertEqual(shape.property(22), None)
|
self.assertEqual(shape.property(22), None)
|
||||||
self.assertEqual(shape.property(42), "the answer")
|
self.assertEqual(shape.property(42), "the answer")
|
||||||
self.assertEqual(shape.property("42"), None)
|
self.assertEqual(shape.property("42"), None)
|
||||||
self.assertEqual(shape.property(42.0), "the answer")
|
self.assertEqual(shape.property(42.0), None)
|
||||||
|
|
||||||
ly2 = pya.Layout()
|
ly2 = pya.Layout()
|
||||||
ly2.read(file_oas)
|
ly2.read(file_oas)
|
||||||
|
|
@ -1158,7 +1158,7 @@ class DBLayoutTest(unittest.TestCase):
|
||||||
shape = s
|
shape = s
|
||||||
self.assertEqual(shape.property(2), "hello, world")
|
self.assertEqual(shape.property(2), "hello, world")
|
||||||
self.assertEqual(shape.property("2"), None)
|
self.assertEqual(shape.property("2"), None)
|
||||||
self.assertEqual(shape.property(2.0), "hello, world")
|
self.assertEqual(shape.property(2.0), None)
|
||||||
self.assertEqual(shape.property(22), None)
|
self.assertEqual(shape.property(22), None)
|
||||||
self.assertEqual(shape.property("42"), "the answer")
|
self.assertEqual(shape.property("42"), "the answer")
|
||||||
self.assertEqual(shape.property(42), None)
|
self.assertEqual(shape.property(42), None)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue