diff --git a/src/lib/diff/gen-node.hpp b/src/lib/diff/gen-node.hpp index fece1c643..8daca99eb 100644 --- a/src/lib/diff/gen-node.hpp +++ b/src/lib/diff/gen-node.hpp @@ -123,6 +123,7 @@ namespace diff{ class GenNode; using Rec = Record; + using MakeRec = Rec::Mutator; using DataValues = meta::Types - Mutator - attrib (ARGS&& ...args) - { - return Mutator(*this).attrib(std::forward(args)...); - } - - template - Mutator - scope (ARGS&& ...args) - { - return Mutator(*this).scope(std::forward(args)...); - } - - // to close and finish builder chain (needs specialisation) - VAL&& - genNode() - { - return Mutator(*this).genNode(); - } - - VAL&& - genNode(string const& symbolicID) - { - return Mutator(*this).genNode(symbolicID); - } - - - /* ==== Exposing scope and contents for iteration ====== */ using iterator = IterAdapter; @@ -370,6 +332,10 @@ namespace diff{ Rec record_; public: + Mutator() + : record_() + { } + explicit Mutator (Rec const& startingPoint) : record_(startingPoint) diff --git a/tests/library/diff/gen-node-basic-test.cpp b/tests/library/diff/gen-node-basic-test.cpp index cd561579b..8a4127e0d 100644 --- a/tests/library/diff/gen-node-basic-test.cpp +++ b/tests/library/diff/gen-node-basic-test.cpp @@ -149,10 +149,10 @@ namespace test{ void objectShortcut() { - auto o0 = Rec().genNode(); - auto o1 = Rec().genNode("νόμος"); - auto o2 = Rec().type("spam").genNode(); - auto o3 = Rec().attrib("Ψ", int64_t(42), "π", 3.14159265358979323846264338328).genNode("νόμος"); + auto o0 = MakeRec().genNode(); + auto o1 = MakeRec().genNode("νόμος"); + auto o2 = MakeRec().type("spam").genNode(); + auto o3 = MakeRec().attrib("Ψ", int64_t(42), "π", 3.14159265358979323846264338328).genNode("λόγος"); CHECK (!o0.isNamed()); CHECK (isnil(o0.data.get())); @@ -167,22 +167,22 @@ namespace test{ CHECK (isnil(o2.data.get())); CHECK (o3.isNamed()); - CHECK ("νόμος" == o3.idi.getSym()); + CHECK ("λόγος" == o3.idi.getSym()); CHECK ("NIL" == o3.data.get().getType()); CHECK (GenNode("Ψ", int64_t(42)) == o3.data.get().get("Ψ")); - CHECK (42L == o3.data.get().get("Ψ").data.get); - CHECK (1e-7 > fabs (3.14159265 - o3.data.get().get("π").data.get)); + CHECK (42L == o3.data.get().get("Ψ").data.get()); + CHECK (1e-7 > fabs (3.14159265 - o3.data.get().get("π").data.get())); LuidH luid; //Demonstration: object builder is based on the mutator mechanism for Records... - auto o4 = Rec::Mutator(o2) // ...use GenNode o2 as starting point - .appendChild(GenNode("τ", Time(1,2,3,4))) // a named node with Time value - .scope('*' // a char node - ,"★" // a string node - ,luid // a hash value (LUID) - ,TimeSpan(Time::ZERO, FSecs(23,25)) // a time span - ,Rec().type("ham").scope("eggs").genNode()) // a spam object - .genNode("baked beans"); // ---> finish into named node + auto o4 = Rec::Mutator(o2.data.get()) // ...use GenNode o2 as starting point + .appendChild(GenNode("τ", Time(1,2,3,4))) // a named node with Time value + .scope('*' // a char node + ,"★" // a string node + ,luid // a hash value (LUID) + ,TimeSpan(Time::ZERO, FSecs(23,25)) // a time span + ,MakeRec().type("ham").scope("eggs").genNode()) // a spam object + .genNode("baked beans"); // ---> finish into named node CHECK (o4.isNamed()); CHECK ("baked beans" == o4.idi.getSym()); @@ -202,7 +202,7 @@ namespace test{ ++scope; auto spam = *scope; CHECK (!++scope); - CHECK ("ham" == spam.getType()); + CHECK ("ham" == spam.data.get().getType()); CHECK (spam.contains (GenNode("eggs"))); // but while o4 was based on o2, @@ -215,7 +215,7 @@ namespace test{ void symbolReference() { - GenNode ham = Rec().type("spam").attrib("τ", Time(23,42)).genNode("egg bacon sausage and spam"); + GenNode ham = MakeRec().type("spam").attrib("τ", Time(23,42)).genNode("egg bacon sausage and spam"); GenNode::ID hamID(ham); CHECK (hamID == ham.idi);