Invocation: reshape scheme for data-access for Param-Weaving-Pattern

As it turns out, we need to embed the Param-Functor tuple,
but only for a single use from a »builder« component.

On the other hand, the nested »Slot« classes are deemed dangerous,
since they just seem to invite being bound into some functor, which
would create a dangling reference once the `ParamBuildSpec` is gone.

Thus it's better to do away with this reference and make those accessors
basically static, because this way they ''can'' be embedded into param-access
functors (and I'd expect precisely that to happen in real use)
This commit is contained in:
Fischlurch 2025-01-02 03:08:34 +01:00
parent 93bb64d6a2
commit 2468f6d0ee
3 changed files with 184 additions and 94 deletions

View file

@ -62,6 +62,7 @@ namespace engine {
using std::move;
using std::forward;
using std::function;
using std::make_tuple;
using std::tuple;
using lib::Several;////TODO RLY?
@ -96,6 +97,15 @@ namespace engine {
return addSlot ([paramVal](TurnoutSystem&){ return paramVal; });
}
/** intended for unit-testing: invoke one of the embedded param-functors */
template<size_t slot>
auto
invokeParamFun (TurnoutSystem& turnoutSys)
{
return std::get<slot> (functors_) (turnoutSys);
}
/** @internal the _chain constructor type_ is a type rebinding meta function (nested struct),
* which extends the HeteroData chain given by \a ANK with the sequence of types derived from
* the result-values of all functors stored in the ParamBuildSpec, i.e. the resulting param tuple.
@ -104,63 +114,74 @@ namespace engine {
*/
using ChainCons = typename lib::meta::RebindVariadic<ANK::template Chain, ParamTup>::Type;
/** invoke all parameter-functors and _drop off_ the result into a »chain-block« (non-copyable) */
typename ChainCons::NewFrame
buildParamDataBlock (TurnoutSystem& turnoutSys)
{
return std::apply ([&](auto&&... paramFun)
{ // invoke parameter-functors and build NewFrame from results
return ChainCons::build (paramFun (turnoutSys) ...);
}
,functors_);
}
/** invoke all parameter-functors and package all results by placement-new into a »chain-block« */
void
emplaceParamDataBlock (void* storage, TurnoutSystem& turnoutSys)
{
std::apply ([&](auto&&... paramFun)
{ // invoke parameter-functors and build NewFrame from results
ChainCons::emplace (storage, paramFun (turnoutSys) ...);
}
,functors_);
}
/** a (static) getter functor able to work on the full extended HeteroData-Chain
* @remark the front-end of this chain resides in TurnoutSystem */
template<size_t slot>
class Slot
struct Accessor
: util::MoveOnly
{
ParamBuildSpec& spec_;
Slot (ParamBuildSpec& spec)
: spec_{spec}
{ }
friend class ParamBuildSpec;
public:
auto
invokeParamFun (TurnoutSystem& turnoutSys)
{
return std::get<slot> (spec_.functors_) (turnoutSys);
}
/** a getter functor able to work on the full extended HeteroData-Chain
* @remark the front-end of this chain resides in TurnoutSystem */
using Accessor = typename ChainCons::template Accessor<slot>;
static auto makeAccessor() { return Accessor{}; }
static auto&
getParamVal (TurnoutSystem& turnoutSys)
{
return turnoutSys.get (makeAccessor());
using StorageAccessor = typename ChainCons::template Accessor<slot>;
return turnoutSys.get (StorageAccessor());
}
};
template<size_t idx>
Slot<idx>
slot()
{ return *this; }
Accessor<idx>
makeAccessor()
{
return Accessor<idx>{};
}
class BlockBuilder
: util::MoveOnly
{
Functors functors_;
public:
/** invoke all parameter-functors and _drop off_ the result into a »chain-block« (non-copyable) */
typename ChainCons::NewFrame
buildParamDataBlock (TurnoutSystem& turnoutSys)
{
return std::apply ([&](auto&&... paramFun)
{ // invoke parameter-functors and build NewFrame from results
return ChainCons::build (paramFun (turnoutSys) ...);
}
,functors_);
}
/** invoke all parameter-functors and package all results by placement-new into a »chain-block« */
void
emplaceParamDataBlock (void* storage, TurnoutSystem& turnoutSys)
{
std::apply ([&](auto&&... paramFun)
{ // invoke parameter-functors and build NewFrame from results
ChainCons::emplace (storage, paramFun (turnoutSys) ...);
}
,functors_);
}
private:
BlockBuilder (Functors&& funz)
: functors_{move (funz)}
{ }
friend class ParamBuildSpec;
};
/**
* Terminal Builder: (destructively) transform this ParamBuildSpec
* into a BlockBuilder, which can then be used to create a Parameter data block,
* thereby invoking the embedded functors and drop-off the results into storage.
*/
BlockBuilder
makeBlockBuilder()
{
return BlockBuilder (move (functors_));
}
};
auto
@ -179,20 +200,30 @@ namespace engine {
{
using Functors = typename SPEC::Functors;
using DataBlock = typename SPEC::ChainCons::NewFrame;
using BlockBuilder = typename SPEC::BlockBuilder;
Functors paramFunctors;
BlockBuilder blockBuilder_;
function<void(TurnoutSystem&)> postProcess_;
struct Feed
: util::NonCopyable
{
lib::UninitialisedStorage<DataBlock> buffer;
DataBlock& block() { return buffer[0]; }
void
emplaceParamDataBlock (BlockBuilder& builder, TurnoutSystem& turnoutSys)
{
builder.emplaceParamDataBlock (&block(), turnoutSys);
}
};
/** forwarding-ctor to provide the detailed input/output connections */
template<typename...ARGS>
ParamWeavingPattern (Functors funTup)
: paramFunctors{move (funTup)}
ParamWeavingPattern (BlockBuilder builder)
: blockBuilder_{move (builder)}
{ }

View file

@ -142,21 +142,25 @@ namespace test {
CHECK (showType<ParamTup>() == "tuple<uint, long>"_expect);
// can now store accessor-functors for later use....
auto acc0 = spec.slot<0>().makeAccessor();
auto acc1 = spec.slot<1>().makeAccessor();
auto acc0 = spec.makeAccessor<0>();
auto acc1 = spec.makeAccessor<1>();
// drive test with a random »nominal Time« <10s with ms granularity
Time nomTime{rani(10'000),0};
TurnoutSystem turnoutSys{nomTime};
// can now immediately invoke the embedded parameter-functors
auto v0 = spec.slot<0>().invokeParamFun (turnoutSys);
auto v1 = spec.slot<1>().invokeParamFun (turnoutSys);
auto v0 = spec.invokeParamFun<0> (turnoutSys);
auto v1 = spec.invokeParamFun<1> (turnoutSys);
CHECK (v0 == LIFE_AND_UNIVERSE_4EVER); // ◁————————— the first paramFun yields the configured fixed value
CHECK (v1 == FrameNr::quant (nomTime, "grid_sec")); // ◁————————— the second paramFun accesses the time in TurnoutSystem
// after all setup of further accessor functors is done
// finally transform the ParamSpec into a storage-block-builder:
auto blockBuilder = spec.makeBlockBuilder();
{ // Now build an actual storage block in local scope,
// thereby invoking the embedded parameter-functors...
auto paramBlock = spec.buildParamDataBlock (turnoutSys);
auto paramBlock = blockBuilder.buildParamDataBlock (turnoutSys);
// Values are now materialised into paramBlock
CHECK (v0 == paramBlock.get<0>());
CHECK (v1 == paramBlock.get<1>());
@ -165,11 +169,9 @@ namespace test {
turnoutSys.attachChainBlock(paramBlock);
// can now access the parameter values through the TurnoutSystem as front-End
CHECK (v0 == spec.slot<0>().getParamVal (turnoutSys));
CHECK (v1 == spec.slot<1>().getParamVal (turnoutSys));
// and can also use the accessor-functors stored above
CHECK (v0 == turnoutSys.get(acc0));
CHECK (v1 == turnoutSys.get(acc1));
// using the pre-configured accessor-functors stored above
CHECK (v0 == acc0.getParamVal (turnoutSys));
CHECK (v1 == acc1.getParamVal (turnoutSys));
// should detach extension block before leaving scope
turnoutSys.detachChainBlock(paramBlock);
@ -180,7 +182,7 @@ namespace test {
using Feed = WaPa::Feed;
Feed feed;
spec.emplaceParamDataBlock (& feed.buffer[0], turnoutSys);
feed.emplaceParamDataBlock (blockBuilder, turnoutSys);
SHOW_EXPR(feed.buffer[0].get<0>())
SHOW_EXPR(feed.buffer[0].get<1>())
TODO ("implement a simple Builder for ParamAgent-Node");

View file

@ -82339,9 +82339,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1735353970175" ID="ID_542964897" MODIFIED="1735519560792" TEXT="und ist ein HeteroData-Accessor"/>
<node CREATED="1735519565352" ID="ID_646241396" MODIFIED="1735519667848" TEXT="mit dem TurnoutSystem als Front-Block">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Das hei&#223;t, hier haben wir immer einen festen Satz an Parametern, die stets im TurnoutSystem eingebettet vorliegen; diese k&#246;nnen aber als HeteroData-Chain erweitert werden um die Bl&#246;cke, die wir &#252;ber eine (oder eine Kette von) ParamBuildSpec erzeugen
@ -94373,15 +94371,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735607847586" ID="ID_326138637" MODIFIED="1735698010312" TEXT="Weaving-Pattern passend anlegen">
<icon BUILTIN="pencil"/>
<node CREATED="1735606520452" ID="ID_1370206629" MODIFIED="1735607879217" TEXT="Knackpunkt hier: Chain-Block ist non-copyable">
<arrowlink COLOR="#71475a" DESTINATION="ID_410550585" ENDARROW="Default" ENDINCLINATION="-194;-5;" ID="Arrow_ID_1355764856" STARTARROW="None" STARTINCLINATION="58;229;"/>
<node CREATED="1735606533963" ID="ID_232275034" MODIFIED="1735606547772" TEXT="das geht sehr wohl: FeedManifold ist ebenfalls non-copyable"/>
<node CREATED="1735607046676" ID="ID_1197786320" MODIFIED="1735607106657" TEXT="Konsequenz w&#xe4;re, anschlie&#xdf;end noch explizit ans Turnout-System &#xbb;andocken&#xab; zu m&#xfc;ssen"/>
<node CREATED="1735607701692" ID="ID_1665864698" MODIFIED="1735607715223" TEXT="oder &#x2014; &#x2014; RAII">
<node CREATED="1735607772387" ID="ID_1329533749" MODIFIED="1735607838831" TEXT="geht das &#xfc;berhaupt?"/>
<node CREATED="1735607884541" ID="ID_809521085" MODIFIED="1735607928616" TEXT="nur wenn man erbt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn ich kann nicht ein non-copyable-Member fertig per Konstruktor bekommen....
@ -94393,9 +94390,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1735607937133" ID="ID_328206928" MODIFIED="1735607951086" TEXT="oder wenn man den Funktor bekommt und selber aufruft"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1735608975638" ID="ID_1109142296" MODIFIED="1735609812282" TEXT="zweite Frage: wann?">
<node COLOR="#435e98" CREATED="1735608975638" ID="ID_1109142296" MODIFIED="1735783209314" TEXT="zweite Frage: wann?">
<icon BUILTIN="help"/>
<node CREATED="1735608988000" ID="ID_895559050" MODIFIED="1735693559907" TEXT="echtes RAII &#x27f9; dann sofort">
<node COLOR="#5b280f" CREATED="1735608988000" ID="ID_895559050" MODIFIED="1735783201716" TEXT="echtes RAII &#x27f9; dann sofort">
<icon BUILTIN="button_cancel"/>
<node CREATED="1735609004510" ID="ID_1911256331" MODIFIED="1735609026839" TEXT="w&#xfc;rde bedeuten: praktisch alles passiert im mount(TurnoutSystem&amp;)"/>
<node CREATED="1735609090986" ID="ID_951840714" MODIFIED="1735609113027" TEXT="f&#xfc;r die (optionale) Nachverarbeitung bleibt noch Design-Spielraum"/>
<node CREATED="1735609138368" ID="ID_1518007270" MODIFIED="1735609168204" TEXT="man w&#xfc;rde dann aber wohl auch schon in pull() an die Delegate-Node weitergeben"/>
@ -94404,9 +94402,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1735609299238" ID="ID_665339625" MODIFIED="1735609315400" TEXT="der rekursive Call hatte keinen zur Verf&#xfc;gung"/>
<node CREATED="1735609349100" ID="ID_396734688" MODIFIED="1735609491766" TEXT="als m&#xfc;&#xdf;te man hier dann das BuffHandle &#x201e;umleiten&#x201c;">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
hei&#223;t, man m&#252;&#223;te entweder explizit umkopieren, oder es br&#228;uchte eine Konvention, wie man das (optional) gegebene BuffHandle dann eben doch frei gibt; letztlich wird ja ein BuffHandle zur&#252;ckgegeben, und das w&#228;re dann dasjenige, da&#223; vom rekursiven Call belegt wurde. K&#246;nnte sogar klappen, ist aber<i>&#160;als Trickserei</i>&#160;zu werten.
@ -94419,9 +94415,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1735609494932" ID="ID_1864279920" MODIFIED="1735609503487" TEXT="der weft()-Aufruf w&#xe4;re komplett NOP">
<node CREATED="1735609505407" ID="ID_1526678544" MODIFIED="1735609651872" TEXT="warum auch nicht....">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Die Aufteilung in diese f&#252;nf Schritte dient vor allem der Gliederung der Abl&#228;ufe; es ist aber nur bedingt ein &#187;Protokoll&#171;, in dem in bestimmten Schritten etwas Festgelegtes <i>passieren mu&#223;...</i>
@ -94432,9 +94426,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1735609517769" ID="ID_302975776" MODIFIED="1735609561229" TEXT="trotzdem ein Hinweis, da&#xdf; mit dem Design etwas nicht stimmt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Wenn man Strukturen biegen, leer machen oder umdeuten mu&#223;...
@ -94448,7 +94440,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="smiley-angry"/>
</node>
</node>
<node CREATED="1735609684093" ID="ID_1602209150" MODIFIED="1735609699782" TEXT="oder: einen UninitialisedStorage-Block vorsehen">
<node CREATED="1735609684093" ID="ID_1602209150" MODIFIED="1735783205922" TEXT="oder: einen UninitialisedStorage-Block vorsehen">
<icon BUILTIN="forward"/>
<node CREATED="1735609703440" ID="ID_1428111001" MODIFIED="1735609715570" TEXT="die Gr&#xf6;&#xdf;e ist ja im Voraus bekannt"/>
<node CREATED="1735609732772" ID="ID_1616902380" MODIFIED="1735609783730" TEXT="Sch&#xf6;n ist das nicht....">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
@ -94463,8 +94456,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735693540805" ID="ID_647246098" MODIFIED="1735693549403" TEXT="Typ-Parametrisierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1735693540805" ID="ID_647246098" MODIFIED="1735783194787" TEXT="Typ-Parametrisierung">
<icon BUILTIN="info"/>
<node CREATED="1735693996066" ID="ID_40351970" MODIFIED="1735694009501" TEXT="auch hier eine Art Prototype...."/>
<node CREATED="1735694010801" ID="ID_914830627" MODIFIED="1735694086013" TEXT="das hei&#xdf;t: das Weaving-Pattern mu&#xdf; das Funktoren-Tupel enthalten"/>
<node CREATED="1735694092810" ID="ID_1337845365" MODIFIED="1735694220094" TEXT="&#x27f9; die ParamBuildSpec ist der nat&#xfc;rliche Typ-Parameter">
@ -94472,20 +94465,33 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1735694246354" ID="ID_1680447149" MODIFIED="1735694265234" TEXT="enth&#xe4;lt aber auch die Zustatz-Info &#xfc;ber die Chain-Struktur (ANK)"/>
</node>
<node CREATED="1735694325648" ID="ID_836420159" MODIFIED="1735694338272" TEXT="(w&#xe4;re dann move-only wie alle Funktoren hier)"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1735697993386" ID="ID_797613352" MODIFIED="1735698002027" TEXT="+ weitere Parametrisierung">
<icon BUILTIN="flag-pink"/>
<node COLOR="#5b280f" CREATED="1735697993386" ID="ID_797613352" MODIFIED="1735783180590" TEXT="+ weitere Parametrisierung">
<icon BUILTIN="button_cancel"/>
<node COLOR="#5b280f" CREATED="1735775051227" ID="ID_150070527" MODIFIED="1735775076604" TEXT="keine weiteren Typ-Parameter notwendig">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1735775078805" ID="ID_773290103" LINK="#ID_499331038" MODIFIED="1735775549052" TEXT="ergibt sich n&#xe4;mlich alles bereits aus der Spec">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735775093091" ID="ID_1477113659" MODIFIED="1735775124239" TEXT="aber Laufzeit-Parameter sind nat&#xfc;rlich notwendig">
<icon BUILTIN="yes"/>
<node CREATED="1735775126615" ID="ID_861839311" MODIFIED="1735775141609" TEXT="(optionaler) Postprocessing-Funktor"/>
<node CREATED="1735775143004" ID="ID_684578183" MODIFIED="1735775147851" TEXT="die delegate-Node">
<node CREATED="1735775198229" ID="ID_437087940" MODIFIED="1735775203920" TEXT="tats&#xe4;chlich ist es ein Port"/>
<node CREATED="1735775217736" ID="ID_932887443" MODIFIED="1735775229474" TEXT="sonst m&#xfc;ssen wir weiter nichts wissen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735696073802" ID="ID_1789382943" MODIFIED="1735696136906" TEXT="ParamBlock erstellen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1735696138642" ID="ID_410550585" MODIFIED="1735696170853" TEXT="erneut das Problem: der Chain-Block soll non-copyable sein">
</node>
</node>
<node COLOR="#338800" CREATED="1735696073802" ID="ID_1789382943" MODIFIED="1735783163617" TEXT="ParamBlock erstellen">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1735696138642" ID="ID_410550585" MODIFIED="1735783236775" TEXT="erneut das Problem: der Chain-Block soll non-copyable sein">
<linktarget COLOR="#71475a" DESTINATION="ID_410550585" ENDARROW="Default" ENDINCLINATION="-194;-5;" ID="Arrow_ID_1355764856" SOURCE="ID_1370206629" STARTARROW="None" STARTINCLINATION="58;229;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node COLOR="#338800" CREATED="1735696214236" ID="ID_1168622804" MODIFIED="1735697968996" TEXT="brauche folglich eine placement-new-Variante des Builders">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...da gibt es definitiv keinen anderen Ausweg, und eigentlich wird ja dadurch auch erst die Builder-Notation wirklich sinnvoll; da&#223; man ein non-copyable-Objekt aus einer Funktion &#8222;abwerfen&#8220; kann ist sowiso grenzwertig....
@ -94493,14 +94499,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html>
</richcontent>
<node BACKGROUND_COLOR="#c8cbaf" CREATED="1735697219515" ID="ID_1960332816" MODIFIED="1735697251917" TEXT="warum &#xe4;rgere ich mich jetz dar&#xfc;ber so?">
<node BACKGROUND_COLOR="#c8cbaf" CREATED="1735697219515" ID="ID_1960332816" MODIFIED="1735777474732" TEXT="warum &#xe4;rgere ich mich jetz so dr&#xfc;ber?">
<icon BUILTIN="smiley-angry"/>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1735697259608" ID="ID_1882455580" MODIFIED="1735697659702" TEXT="deshalb macht man doch Prototyping....">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...damit man sieht, wie man's tats&#228;chlich braucht;
@ -94524,12 +94528,65 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#338800" CREATED="1735783168387" ID="ID_997169063" MODIFIED="1735783174191" TEXT="funktioniert im Test">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735777939763" ID="ID_654818284" MODIFIED="1735783309728" TEXT="Setup-Parameter im Weaving-Pattern">
<icon BUILTIN="pencil"/>
<node COLOR="#5b280f" CREATED="1735777972926" ID="ID_1471110800" MODIFIED="1735783080965" TEXT="das Funktoren-Tupel">
<icon BUILTIN="button_cancel"/>
<node CREATED="1735778000411" ID="ID_605093508" MODIFIED="1735778009822" TEXT="eigentlich brauchen wir nur einen Block-Builder"/>
<node CREATED="1735778011170" ID="ID_1721187835" MODIFIED="1735778025451" TEXT="aber in dem m&#xfc;&#xdf;te das Tupel drinnen stecken"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1735778026895" ID="ID_876564472" MODIFIED="1735778038315" TEXT="&#xdc;berlapp mit der Spec im aktuellen Design">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1735778040638" ID="ID_325760853" MODIFIED="1735778053152" TEXT="wir k&#xf6;nnten die Spec speichern"/>
<node CREATED="1735778055468" ID="ID_652295544" MODIFIED="1735778070117" TEXT="aber deren ganzer Builder-Part ist eigentlich redundant"/>
<node CREATED="1735778077929" ID="ID_671471594" MODIFIED="1735778083788" TEXT="Problem Lebensdauer">
<node CREATED="1735778085728" ID="ID_976549195" MODIFIED="1735778105690" TEXT="die Spec liegt vmtl. in einem lokalen Kontext auf einem h&#xf6;heren Builder-Level"/>
<node CREATED="1735778107174" ID="ID_1002340864" MODIFIED="1735778123062" TEXT="&#x27f9; mu&#xdf; daf&#xfc;r sorgen, die Funktoren zu kopieren"/>
<node COLOR="#5b280f" CREATED="1735778139784" ID="ID_1567643331" MODIFIED="1735778168511" TEXT="Vorsicht: der &#xbb;Slot&#xab; in der Spec ist im Moment so ein typisches hexagonales Feature">
<icon BUILTIN="clanbomber"/>
<node CREATED="1735778171108" ID="ID_1152708895" MODIFIED="1735778180183" TEXT="sooo sch&#xf6;n zum Tests schreiben"/>
<node CREATED="1735778181967" ID="ID_1583052091" MODIFIED="1735778195421" TEXT="gef&#xe4;hrlich irref&#xfc;hrend f&#xfc;r jeden anderen Gebrauch"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1735780756823" ID="ID_1015981716" MODIFIED="1735780763078" TEXT="Umbau!">
<icon BUILTIN="flag-pink"/>
<node CREATED="1735780764829" ID="ID_819223004" MODIFIED="1735780789925" TEXT="den &#xbb;Slot&#xab; in einen statischen Accessor umschreiben">
<node CREATED="1735783005113" ID="ID_686667351" MODIFIED="1735783018619" TEXT="hier w&#xe4;re der Back-Link auf die Spec gradezu gemeingef&#xe4;hrlich"/>
<node CREATED="1735783020065" ID="ID_1376680768" MODIFIED="1735783041921" TEXT="im Grunde braucht man hier nur den Typ, den man in andere Accessor-Funktoren einbettet">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1735780792553" ID="ID_598255406" MODIFIED="1735781123512" TEXT="daf&#xfc;r eine makeBlockBuilder()-Funktion (destruktiv)">
<node CREATED="1735780814414" ID="ID_971841806" MODIFIED="1735780821795" TEXT="schiebt das Funktoren-Tupel dorthin"/>
<node CREATED="1735780823097" ID="ID_363538159" MODIFIED="1735780849748" TEXT="die sonstige Spec sollte keinen direkten Bezug auf die Funktoren mehr haben"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735783048795" ID="ID_1635709601" MODIFIED="1735783108281" TEXT="der BlockBuilder wandert dann in das WeavingPattern">
<arrowlink COLOR="#3538b8" DESTINATION="ID_487478594" ENDARROW="Default" ENDINCLINATION="16;-84;" ID="Arrow_ID_602775247" STARTARROW="None" STARTINCLINATION="-450;23;"/>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node CREATED="1735783082614" ID="ID_487478594" MODIFIED="1735783101705" TEXT="BlockBuilder">
<linktarget COLOR="#3538b8" DESTINATION="ID_487478594" ENDARROW="Default" ENDINCLINATION="16;-84;" ID="Arrow_ID_602775247" SOURCE="ID_1635709601" STARTARROW="None" STARTINCLINATION="-450;23;"/>
<node COLOR="#435e98" CREATED="1735783113618" ID="ID_853147988" MODIFIED="1735783152469" TEXT="ist der Terminal-Build-Schritt aus einer Spec">
<icon BUILTIN="info"/>
</node>
<node CREATED="1735783127128" ID="ID_1710125600" MODIFIED="1735783147008" TEXT="man k&#xf6;nnte aber (falls notwendig und m&#xf6;glich) die Spec vorher kopieren">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1735354094901" ID="ID_357401280" LINK="#ID_1484484879" MODIFIED="1735416065935" TEXT="Grundstruktur / Schrittfolge">
<node CREATED="1735354099466" ID="ID_1086019960" MODIFIED="1735354156573" TEXT="mount : Feed-Frame erzeugen"/>
<node CREATED="1735354158273" ID="ID_1400465949" MODIFIED="1735354198247" TEXT="pull : Param-Funktor aufrufen und Tupel erstellen"/>
<node CREATED="1735354209348" ID="ID_1189493104" MODIFIED="1735354256129" TEXT="shed : Chain-Block erstellen und nachverarbeiten"/>
<node CREATED="1735354209348" ID="ID_1189493104" MODIFIED="1735354256129" TEXT="shed : Chain-Block erstellen und nachverarbeiten">
<node CREATED="1735775241705" ID="ID_324071186" MODIFIED="1735775250821" TEXT="Link in das Turnout-System"/>
</node>
<node CREATED="1735354287727" ID="ID_348185915" MODIFIED="1735354316106" TEXT="weft : Target-Node aufrufen"/>
<node CREATED="1735354360652" ID="ID_128985053" MODIFIED="1735354376078" TEXT="fix : Chain-Block abh&#xe4;ngen und Output-Buffer zur&#xfc;ckggeben"/>
</node>