diff --git a/src/lib/diff/gen-node.hpp b/src/lib/diff/gen-node.hpp index 300770c72..1e8a122c7 100644 --- a/src/lib/diff/gen-node.hpp +++ b/src/lib/diff/gen-node.hpp @@ -233,8 +233,8 @@ namespace diff{ idi::getTypeHash()) { } - ID (string const& symbolicID, HashVal seed) - : idi::BareEntryID (symbolicID, seed) + ID (idi::BareEntryID&& rawD) + : idi::BareEntryID{move (rawD)} { } public: @@ -447,12 +447,12 @@ namespace diff{ } }; + /** fabricate a GenNode with the literally given ID */ template static GenNode - forAttribute (string const& key, X&& payload) + asAttribute (idi::BareEntryID && rawID, X&& payload) { - return GenNode{ID(key, std::rand()) // NOTE: random hash seed - ,DataCap(forward (payload))}; + return GenNode{ID{move (rawID)}, DataCap{forward (payload)}}; } @@ -794,14 +794,21 @@ namespace diff{ inline GenNode MakeRec::genNode() { - return GenNode(std::move(record_)); + return GenNode{std::move(record_)}; } template<> inline GenNode - MakeRec::genNode(string const& symbolicID) + MakeRec::genNode (idi::BareEntryID rawID) { - return GenNode(symbolicID, std::move(record_)); + return GenNode::asAttribute (std::move(rawID), std::move(record_)); + } + + template<> + inline GenNode + MakeRec::genNode (string const& symbolicID) + { + return GenNode{symbolicID, std::move(record_)}; } @@ -867,7 +874,7 @@ namespace diff{ inline GenNode Rec::buildAttribute (string const& key, X&& payload) { - return GenNode::forAttribute (key, forward(payload)); + return GenNode{key, forward(payload)}; } diff --git a/src/lib/diff/record.hpp b/src/lib/diff/record.hpp index 35e21e3bb..f00ae35a8 100644 --- a/src/lib/diff/record.hpp +++ b/src/lib/diff/record.hpp @@ -112,7 +112,9 @@ namespace lib { template class PlantingHandle; - +namespace idi { + class BareEntryID; +} namespace diff{ namespace error = lumiera::error; @@ -562,6 +564,7 @@ namespace diff{ */ VAL genNode(); + VAL genNode(idi::BareEntryID rawID); VAL genNode(string const& symbolicID); template diff --git a/tests/library/diff/gen-node-basic-test.cpp b/tests/library/diff/gen-node-basic-test.cpp index 2b73c72f8..5967d656b 100644 --- a/tests/library/diff/gen-node-basic-test.cpp +++ b/tests/library/diff/gen-node-basic-test.cpp @@ -211,6 +211,15 @@ namespace test{ // but while o4 was based on o2, // adding all the additional contents didn't mutate o2 CHECK (isnil(o2.data.get())); + + // special case: can create an (Attribute) GenNode with specifically crafted ID + idi::EntryID veryspecialID{"quasi niente"}; + auto o5 = MakeRec().genNode(veryspecialID); + CHECK (o5 != MakeRec().genNode()); + CHECK (o5 != MakeRec().genNode("quasi niente")); + CHECK (o5 == MakeRec().genNode(veryspecialID)); + CHECK (name(o5) == "quasi_niente"); // Note: EntryID sanitised the string + CHECK (o5.idi == veryspecialID); } diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 7ce8628d3..d2f2ca438 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -21056,7 +21056,12 @@ - + + + + + + @@ -21156,6 +21161,85 @@ + + + + + + +

+ aber: zufällige ID macht Objekt-builder stateful +

+ + +
+ + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + +

+ das heißt. +

+

+ die Konstruktion des Domain-Modelles ist dafür zuständig +

+

+ für global eindeutige IDs an den relevanten Stellen zu sorgen +

+ + +
+ + + + + + + +

+ ...dem man eine EntryID geben kann +

+ + +
+ +
+ + + + + + + + + + + + + +