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)
{
return *(reinterpret_cast <const tl::Variant *> (id));
if (id == 0) {
static tl::Variant nil;
return nil;
} else {
return *(reinterpret_cast <const tl::Variant *> (id));
}
}
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)
{
return *(reinterpret_cast <const tl::Variant *> (id));
if (id == 0) {
static tl::Variant nil;
return nil;
} else {
return *(reinterpret_cast <const tl::Variant *> (id));
}
}
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)
{
return *(reinterpret_cast <const PropertiesSet *> (id));
if (id == 0) {
static db::PropertiesSet empty;
return empty;
} else {
return *(reinterpret_cast <const PropertiesSet *> (id));
}
}
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);
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;
return nil;
} else {
@ -140,7 +155,7 @@ const tl::Variant &
PropertiesSet::value (db::property_names_id_type nid) const
{
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;
return nil;
} else {
@ -159,20 +174,26 @@ PropertiesSet::erase (const tl::Variant &name)
{
db::property_names_id_type nid = db::property_names_id (name);
auto i = m_map.find (nid);
while (i != m_map.end () && i->second == nid) {
m_map.erase (nid);
auto ii = i;
while (i != m_map.end () && i->first == nid) {
++i;
}
if (i != ii) {
m_map.erase (ii, i);
}
}
void
PropertiesSet::erase (db::property_names_id_type nid)
{
auto i = m_map.find (nid);
while (i != m_map.end () && i->second == nid) {
m_map.erase (nid);
auto ii = i;
while (i != m_map.end () && i->first == nid) {
++i;
}
if (i != ii) {
m_map.erase (ii, i);
}
}
void
@ -224,10 +245,11 @@ tl::Variant
PropertiesSet::to_list_var () const
{
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 ();
el.push (db::property_name (i->first));
el.push (db::property_value (i->second));
el.push (i->first);
el.push (i->second);
var.push (el);
}
return var;
@ -344,7 +366,7 @@ PropertiesRepository::properties_id (const PropertiesSet &props)
changed = true;
} 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);
/**
* @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
*

View File

@ -118,8 +118,8 @@ TEST(BasicPropertySetsInRepository)
EXPECT_EQ (id1, id1_copy);
EXPECT_EQ (id2, id2_copy);
EXPECT_EQ (rep.properties (id1) == set1, true);
EXPECT_EQ (rep.properties (id2) == set2, true);
EXPECT_EQ (db::properties (id1) == set1, true);
EXPECT_EQ (db::properties (id2) == set2, true);
}
TEST(PropertySets)
@ -151,14 +151,14 @@ TEST(PropertySets)
EXPECT_EQ (ps1 [tl::Variant ("x")].is_nil (), true);
EXPECT_EQ (ps1 == ps2, false);
EXPECT_EQ (ps1 != ps2, true);
EXPECT_EQ (ps1 < ps2, true);
EXPECT_EQ (ps2 < ps1, false);
EXPECT_EQ (ps1 < ps2, false);
EXPECT_EQ (ps2 < ps1, true);
ps2.swap (ps1);
EXPECT_EQ (ps1.value (tl::Variant (17)).is_nil (), true);
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 ("x")).is_nil (), true);
EXPECT_EQ (ps1 == ps2, true);
@ -187,7 +187,7 @@ TEST(PropertySetsMerge)
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)
@ -198,8 +198,8 @@ TEST(PropertySetsConversions)
ps1.insert (tl::Variant (17), tl::Variant ("value"));
ps1.insert (tl::Variant ("x"), tl::Variant (42));
EXPECT_EQ (ps1.to_dict_var ().to_string (), "...");
EXPECT_EQ (ps1.to_list_var ().to_string (), "...");
EXPECT_EQ (ps1.to_dict_var ().to_string (), "17=>value,x=>42");
EXPECT_EQ (ps1.to_list_var ().to_string (), "17,value,x,42");
auto ps1_map = ps1.to_map ();
EXPECT_EQ (ps1_map.size (), size_t (2));
@ -229,36 +229,36 @@ TEST(PropertiesTranslator)
ps.insert (key1, 100);
ps.insert (key2, 101);
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.insert (key1, 0);
ps.insert (key2, 101);
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.insert (key1, 100);
ps.insert (key3, 102);
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.insert (key1, 100);
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;
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
t = db::PropertiesTranslator::make_pass_all ();
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100\n2=101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0\n2=101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100,2=>101");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0,2=>101");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
t = db::PropertiesTranslator::make_remove_all ();
EXPECT_EQ (db::prop2string (t (prop1a)), "");
@ -269,36 +269,36 @@ TEST(PropertiesTranslator)
std::set<tl::Variant> kf;
kf.insert (1);
t = db::PropertiesTranslator::make_filter (kf, rp);
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=100");
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
kf.insert (3);
t = db::PropertiesTranslator::make_filter (kf, rp);
EXPECT_EQ (db::prop2string (t (prop1a)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=100\n3=102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "1=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "1=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>100,3=>102");
EXPECT_EQ (db::prop2string (t (prop3)), "1=>100");
std::map<tl::Variant, tl::Variant> km;
km[1] = 4;
km[3] = 1;
t = db::PropertiesTranslator::make_key_mapper (km, rp);
EXPECT_EQ (db::prop2string (t (prop1a)), "4=100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=102\n4=100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "1=>102,4=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
kf.clear ();
kf.insert (4);
t = db::PropertiesTranslator::make_filter (kf, rp) * db::PropertiesTranslator::make_key_mapper (km, rp);
EXPECT_EQ (t.is_empty (), false);
EXPECT_EQ (db::prop2string (t (prop1a)), "4=100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=0");
EXPECT_EQ (db::prop2string (t (prop2)), "4=100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=100");
EXPECT_EQ (db::prop2string (t (prop1a)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop1b)), "4=>0");
EXPECT_EQ (db::prop2string (t (prop2)), "4=>100");
EXPECT_EQ (db::prop2string (t (prop3)), "4=>100");
kf.clear ();
kf.insert (3);
@ -314,7 +314,7 @@ TEST(PropertiesTranslator)
EXPECT_EQ (t.is_empty (), false);
EXPECT_EQ (db::prop2string (t (prop1a)), "");
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)), "");
t = db::PropertiesTranslator::make_key_mapper (km, rp);
@ -330,6 +330,6 @@ TEST(PropertiesTranslator)
EXPECT_EQ (t.is_empty (), false);
EXPECT_EQ (db::prop2string (t (prop1a)), "");
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)), "");
}