This commit is contained in:
Matthias Koefferlein 2024-12-24 11:45:16 +01:00
parent 128a00896e
commit c6a097ae61
3 changed files with 73 additions and 59 deletions

View File

@ -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);
} }
} }

View File

@ -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
* *

View File

@ -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)), "");
} }