From 1bbe903202fdc1ba1e2232d42ea0dd47ab7d5d69 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 9 Nov 2018 22:30:35 +0100 Subject: [PATCH] GenNode: revert -- better not handle this problem on ETD level ...rather extend the "object builder" DSL notation to allow passing in a given EntryID literally. Rationale is, we should handle the problem of unique IDs on the level of the domain model. If we attempt to "fix" this within GenNode, the price would be to make the ETD creation stateful --- src/lib/diff/gen-node.hpp | 25 ++++--- src/lib/diff/record.hpp | 5 +- tests/library/diff/gen-node-basic-test.cpp | 9 +++ wiki/thinkPad.ichthyo.mm | 86 +++++++++++++++++++++- 4 files changed, 114 insertions(+), 11 deletions(-) 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 +

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