Invocation: complete simple test case regarding TurnoutSystem

NodeBase_test demonstrates the building blocks of a Render Node,
and verifies low-level mechanics of those building blocks, which
can be quite technical. At the top of this test however are some
very basic interactions, which serve as an introduction.

__Remark__: renamed the low-level technical dispatch-access
for the parameter-accessors in `TurnoutSystem` to be more obvious,
and added comment (I was confused myself how to use them properly)
This commit is contained in:
Fischlurch 2025-02-18 23:55:58 +01:00
parent b7fc2df478
commit 8a4060861f
8 changed files with 107 additions and 33 deletions

View file

@ -217,14 +217,14 @@ namespace lib {
template<class SPEC>
static Type&
get (HeteroData<SPEC>& frontEnd)
retrieveData (HeteroData<SPEC>& frontEnd)
{
auto& fullChain = _Self::recast (frontEnd);
return fullChain.template get<slot>();
}
template<typename HH>
Type& operator() (HH& frontEnd) const { return Accessor::get(frontEnd); }
Type& operator() (HH& frontEnd) const { return Accessor::retrieveData (frontEnd); }
};
/**

View file

@ -477,7 +477,7 @@ namespace engine {
return attachParamFun ([accessor=forward<GET>(getter)]
(TurnoutSystem& turnoutSys)
{
return accessor.getParamVal (turnoutSys);
return turnoutSys.get(accessor);
});
}

View file

@ -197,7 +197,7 @@ namespace engine {
getParamVal (TurnoutSystem& turnoutSys)
{
using StorageAccessor = typename ChainCons::template Accessor<slot>;
return turnoutSys.get (StorageAccessor());
return turnoutSys.retrieveData (StorageAccessor());
}
};

View file

@ -86,13 +86,21 @@ namespace engine {
return invoParam_.get<SLOT_KEY>();
}
/**
* get parameter from extension block,
* as configured by the provided getter functor
* @remark convenience front-end, will deflect to #retrieveData
* @warning only works if an extension block has been attached,
* terminates with unexpected exception else.
*/
template<class ACC>
auto&
get (ACC const& getter)
{
return getter.get (invoParam_);
return getter.getParamVal (*this);
}
/** attach an extension block with further parameters
* as HeteroData-chain to the embedded FrontBlock
* @note structural properties must match, which
@ -111,6 +119,15 @@ namespace engine {
{
chainBlock.detachFrom (invoParam_);
}
/** @internal forward the call from a low-level accessor
* to the embedded anchor data block */
template<class ACC>
auto&
retrieveData (ACC const& getter)
{
return getter(invoParam_);
}
};

View file

@ -23,6 +23,7 @@
#include "steam/engine/turnout.hpp"
#include "steam/engine/turnout-system.hpp"
#include "steam/engine/feed-manifold.hpp"
#include "steam/engine/node-builder.hpp"
#include "steam/engine/diagnostic-buffer-provider.hpp"
#include "steam/engine/buffhandle-attach.hpp"
#include "lib/test/test-helper.hpp"
@ -73,7 +74,29 @@ namespace test {
{
Time nomTime{rani(10'000),0}; // drive test with a random »nominal Time« <10s with ms granularity
TurnoutSystem invoker{nomTime}; // a time spec is mandatory, all further parameters are optional
////////////////////////////////OOO unfinished - demonstrate simple accesses to the TurnoutSystem
CHECK (invoker.getNomTime() == nomTime); // can access those basic params from within the render invocation.
CHECK (invoker.getProcKey() == ProcessKey{});
/* == That's all required for basic usage. == */
// Demonstrate extension-block to TurnoutSystem
// Used to setup elaborate parameter-nodes.
double someVal = defaultGen.uni(); // some param value, computed by »elaborate logic«
auto spec = buildParamSpec()
.addValSlot (someVal); // declare a parameter slot for an extension data block
auto acc0 = spec.makeAccessor<0>(); // capture an accessor-functor for later use
{// Build and connect extension storage block
auto dataBlock =
spec.makeBlockBuilder()
.buildParamDataBlock(invoker);
invoker.attachChainBlock (dataBlock); // link extension data block into the TurnoutSystem
CHECK (invoker.get(acc0) == someVal); // now able to retrieve data from extension block
invoker.detachChainBlock (dataBlock);
}
}

View file

@ -210,8 +210,8 @@ namespace test {
auto accessParam = [acc0,acc1]
(TurnoutSystem& turnoutSys) -> Param
{
return make_tuple (acc0.getParamVal (turnoutSys)
,acc1.getParamVal (turnoutSys));
return make_tuple (turnoutSys.get(acc0)
,turnoutSys.get(acc1));
};
ProcNode delegate{prepareNode("Delegate")

View file

@ -211,7 +211,7 @@ namespace test{
// Note the pitfall: Chain has not been connected yet,
// but the Accessors would assume otherwise
CHECK (Acc2::get(front) == 2.3);
CHECK (Acc2::retrieveData(front) == 2.3);
// Acc3::get(front); // would cause NPE (or assertion failure on debug build)
Acc4 get4; // could even instantiate the accessors...
@ -220,9 +220,9 @@ namespace test{
// Now link the second data element in properly
d2.linkInto(front);
CHECK (Acc1::get(front) == 0);
CHECK (Acc2::get(front) == 2.3);
CHECK (Acc3::get(front) == false);
CHECK (Acc1::retrieveData(front) == 0);
CHECK (Acc2::retrieveData(front) == 2.3);
CHECK (Acc3::retrieveData(front) == false);
CHECK (get4(front) == "Ψ");
// further allocations can even be »elsewhere«
@ -262,12 +262,12 @@ namespace test{
CHECK (d2.get<0>() == true);
CHECK (d2.get<1>() == "Ψ");
CHECK (isSameAdr (Acc1::get(front), v1));
CHECK (isSameAdr (Acc2::get(front), v2));
CHECK (isSameAdr (Acc3::get(front), v3));
CHECK (isSameAdr (Acc4::get(front), v4));
CHECK (isSameAdr (Acc5::get(front), v5));
CHECK (isSameAdr (Acc6::get(front), v6));
CHECK (isSameAdr (Acc1::retrieveData(front), v1));
CHECK (isSameAdr (Acc2::retrieveData(front), v2));
CHECK (isSameAdr (Acc3::retrieveData(front), v3));
CHECK (isSameAdr (Acc4::retrieveData(front), v4));
CHECK (isSameAdr (Acc5::retrieveData(front), v5));
CHECK (isSameAdr (Acc6::retrieveData(front), v6));
CHECK (not isSameAdr (front, v1));
CHECK (not isSameAdr (d2, v3));

View file

@ -91830,6 +91830,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#5c6a7a" DESTINATION="ID_1291306906" ENDARROW="Default" ENDINCLINATION="-289;17;" ID="Arrow_ID_1279473915" STARTARROW="None" STARTINCLINATION="177;10;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739914036725" ID="ID_568175538" MODIFIED="1739914070848" TEXT="Zugriff auf die Basisparameter zeigen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739914046380" ID="ID_487791127" MODIFIED="1739914070848" TEXT="direkt zeigen da&#xdf; ein Chain-Block an/abgekoppelt werden kann">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node COLOR="#338800" CREATED="1734310118603" ID="ID_1954508996" MODIFIED="1734634792828" TEXT="Feed-Manifold: Eigenschaften demonstrieren">
<linktarget COLOR="#406cd3" DESTINATION="ID_1954508996" ENDARROW="Default" ENDINCLINATION="-552;35;" ID="Arrow_ID_640616380" SOURCE="ID_1710382999" STARTARROW="None" STARTINCLINATION="-2974;268;"/>
@ -92397,6 +92403,35 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node COLOR="#338800" CREATED="1739914148197" ID="ID_1024081900" LINK="#ID_1993199858" MODIFIED="1739914184680" TEXT="&#xbb;partial closure&#xab; von Parametern">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1739914220664" ID="ID_368969698" MODIFIED="1739914369459" TEXT="wichtig wenn Parameter verschiedenen Zwecken dienen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Alle Parameter einer processing-function sind in ein einziges Tupel zusammengefa&#223;t, aber typischerweise sind einige <i>technisch, </i>w&#228;hrend andere die <i>gestalterischen Steuerm&#246;glichkeiten </i>der Operation repr&#228;sentieren. Beide Aspekte m&#252;ssen auf dem gleichen NodeBuilder konfiguriert werden, aber aus verschiedenen Quellen (und vermutlich auch in verschiedenen Schritten)
</p>
</body>
</html>
</richcontent>
</node>
<node COLOR="#435e98" CREATED="1739914375831" ID="ID_1345180065" MODIFIED="1739914395658">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
implementiert auf Basis der <i>partial-function-closure</i>
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1736047423403" ID="ID_1699556394" MODIFIED="1736047444321" TEXT="Node-Kette mit zwei Inputs und Parametern">
<icon BUILTIN="button_ok"/>
@ -105745,12 +105780,13 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node CREATED="1739229073559" ID="ID_742095594" MODIFIED="1739229078976" TEXT="Test-Konzept">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1739229073559" ID="ID_742095594" MODIFIED="1739907872979" TEXT="Test-Konzept">
<icon BUILTIN="yes"/>
<node CREATED="1739229080787" ID="ID_508301525" MODIFIED="1739229206584" TEXT="komplett &#xfc;ber das Turnout-System steuern"/>
<node CREATED="1739229119334" ID="ID_144074931" MODIFIED="1739229138054" TEXT="es gibt ein einfaches Frame-Grid zur &#xdc;bersetzung in Frame-Nr"/>
<node CREATED="1739229092233" ID="ID_687505824" MODIFIED="1739229232886" TEXT="der ProcessingKey wird testhalber in den Mix-Parameter (0...100) &#xfc;bersetzt"/>
<node CREATED="1739229243685" ID="ID_1117664884" MODIFIED="1739229263638" TEXT="eine Param-Node demonstriert das Aufbauen synthetischer Parameter"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1739229265043" ID="ID_1535044883" MODIFIED="1739902107664" TEXT="neues Feature: ein Param-Tupel im Builder partiell schlie&#xdf;en">
<node COLOR="#338800" CREATED="1739229265043" FOLDED="true" ID="ID_1535044883" MODIFIED="1739914190981" TEXT="neues Feature: ein Param-Tupel im Builder partiell schlie&#xdf;en">
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a60e65" CREATED="1739229289864" ID="ID_719879915" MODIFIED="1739902084019">
<richcontent TYPE="NODE"><html>
@ -105760,8 +105796,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<b><font size="5">AUA</font></b>!&#8252; Hammer auf den letzten Metern
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -105806,9 +105841,9 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node CREATED="1739230175479" ID="ID_1244437448" MODIFIED="1739230182793" TEXT="nur nicht die Nerven verlieren"/>
<node CREATED="1739230222313" ID="ID_1885735081" MODIFIED="1739230235891" TEXT="es zahlt sich nun aus, da&#xdf; PROT eine Policy ist"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1739242229992" ID="ID_639089925" MODIFIED="1739468102008" TEXT="L&#xf6;sung in mehreren Schritten">
<icon BUILTIN="pencil"/>
<node COLOR="#435e98" CREATED="1739242253189" ID="ID_420283346" MODIFIED="1739468016365" TEXT="grunds&#xe4;tzlich den Proc-Functor adaptieren k&#xf6;nnen">
<node COLOR="#338800" CREATED="1739242229992" ID="ID_639089925" MODIFIED="1739907806847" TEXT="L&#xf6;sung in mehreren Schritten">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1739242253189" FOLDED="true" ID="ID_420283346" MODIFIED="1739907814799" TEXT="grunds&#xe4;tzlich den Proc-Functor adaptieren k&#xf6;nnen">
<icon BUILTIN="full-1"/>
<node CREATED="1739242379940" ID="ID_1980382512" MODIFIED="1739242388022" TEXT="das ist komplett boilerplate"/>
<node CREATED="1739242389157" ID="ID_1269699565" MODIFIED="1739242401453" TEXT="man h&#xe4;ngt die jeweiligen Template-Parameter um und gut is"/>
@ -105817,7 +105852,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1739242290552" ID="ID_575620979" MODIFIED="1739468093469" TEXT="spezielle Funktions-Komposition auf die Parameter-Stelle setzen">
<node COLOR="#435e98" CREATED="1739242290552" FOLDED="true" ID="ID_575620979" MODIFIED="1739907812807" TEXT="spezielle Funktions-Komposition auf die Parameter-Stelle setzen">
<icon BUILTIN="full-2"/>
<node COLOR="#435e98" CREATED="1739242429615" FOLDED="true" ID="ID_1933481502" MODIFIED="1739467883768" TEXT="mu&#xdf; die verschiedenen Definitionsvarianten des Processing-Functors beachten">
<icon BUILTIN="messagebox_warning"/>
@ -105859,7 +105894,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1739242327059" ID="ID_1669934372" MODIFIED="1739905739088" TEXT="Adapter zum Binden bestimmter Argumente im Node-Builder generieren">
<node COLOR="#435e98" CREATED="1739242327059" FOLDED="true" ID="ID_1669934372" MODIFIED="1739907809832" TEXT="Adapter zum Binden bestimmter Argumente im Node-Builder generieren">
<icon BUILTIN="full-3"/>
<node COLOR="#435e98" CREATED="1739549014719" ID="ID_1456986239" MODIFIED="1739901513065" TEXT="Design-Frage: wie weit ausarbeiten?">
<node CREATED="1739549031081" ID="ID_1258607359" MODIFIED="1739890680031" TEXT="minimal-L&#xf6;sung: gar nix bieten &#x2014; User soll &#x3bb; bauen">
@ -105930,8 +105965,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
da&#223; wir jetzt eine std::function erzeugen ist hier <b>ganz furchbar</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="smiley-angry"/>
<node COLOR="#c22556" CREATED="1739901371676" HGAP="30" ID="ID_247907486" MODIFIED="1739901425196" VSHIFT="-5">
<richcontent TYPE="NODE"><html>
@ -106017,7 +106051,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1739582050928" ID="ID_1634640852" MODIFIED="1739890634657" TEXT="also mal im Test-Setup beispielhaft ausarbeiten">
<node COLOR="#435e98" CREATED="1739582050928" FOLDED="true" ID="ID_1634640852" MODIFIED="1739907799729" TEXT="also mal im Test-Setup beispielhaft ausarbeiten">
<linktarget COLOR="#4936b3" DESTINATION="ID_1634640852" ENDARROW="Default" ENDINCLINATION="82;-233;" ID="Arrow_ID_40372708" SOURCE="ID_1709833697" STARTARROW="None" STARTINCLINATION="-287;31;"/>
<icon BUILTIN="yes"/>
<node CREATED="1739644403194" ID="ID_1724825463" MODIFIED="1739644431815" TEXT="Beispiel-Funktion nimmt ein Array mit 5 Parametern"/>
@ -106122,7 +106156,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
</node>
</node>
</node>
<node COLOR="#435e98" CREATED="1739664341156" ID="ID_557298566" MODIFIED="1739834271897" TEXT="mu&#xdf; es in einem Anlauf schaffen...">
<node COLOR="#435e98" CREATED="1739664341156" FOLDED="true" ID="ID_557298566" MODIFIED="1739907794291" TEXT="mu&#xdf; es in einem Anlauf schaffen...">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1739664371521" ID="ID_1608394291" MODIFIED="1739834398403" TEXT="brauche ein umschlie&#xdf;endes Konstruktor-Template">
<icon BUILTIN="button_ok"/>
@ -106373,7 +106407,7 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node COLOR="#338800" CREATED="1739905638057" ID="ID_1129239563" MODIFIED="1739905713937" TEXT="TupleClosure_test">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1739905645042" ID="ID_1993199858" MODIFIED="1739905729945" TEXT="NodeBuilder_test::build_Node_closedParam()">
<node COLOR="#338800" CREATED="1739905645042" ID="ID_1993199858" LINK="#ID_1024081900" MODIFIED="1739914179257" TEXT="NodeBuilder_test::build_Node_closedParam()">
<linktarget COLOR="#4ca333" DESTINATION="ID_1993199858" ENDARROW="Default" ENDINCLINATION="247;0;" ID="Arrow_ID_1792507084" SOURCE="ID_175725143" STARTARROW="None" STARTINCLINATION="-200;14;"/>
<icon BUILTIN="button_ok"/>
</node>