Invocation: develop a plan how to integrate a Parameter functor

This is one remaining tricky detail to be solved.

The underlying difficulty is architectural:
 - the processing functor will be supplied by the Media-Lib-Plug-in
 - while a functor to set parameters and automation will be added from another context

Yet both have to work together, and both together will determine the effective type of the ''Weaving Pattern''
Thus we'll have to get both functors somehow integrated into the Level-2-Builder,
yet we must be able first to pass this builder instance to the Library-Plug-in and then,
in a second step, another part of the Lumiera Builder logic will have to add the Parameter wiring.

The solution I'm proposing is to exploit the observation that in fact the processing functor
is stored as a kind of »Prototype« within the ''Weaving Pattern'' and will be ''copied'' from there
for each individual Render Node invocation. The reasons for this is, we want the optimiser
to see the full instantiation of the library function and thus get maximum leverage;
thus the code doing the actual call must see the functor or lambda to be able to inline it.

This leads to the idea to ''separate'' this »prototype« from the `FeedManifold`;
the latter thereby becomes mostly agnostic of parameter processing.
However, `FeedManifold` must then accept a copy of the parameter values
as constructor argument and pass it into its internal storage.

This forces yet another reorganisation of the class structure.
Basically the storage modules for `FeedManifold` are now prepared within a configuratiton class,
which actually helps to simplify the metaprogramming definitions and keeps the enclosing namespace clean.
This commit is contained in:
Fischlurch 2024-12-19 04:06:26 +01:00
parent 488793174f
commit 3a3b7e4dd7
4 changed files with 436 additions and 141 deletions

View file

@ -107,6 +107,7 @@ namespace engine {
using lib::meta::_Fun;
using lib::meta::enable_if;
using lib::meta::disable_if_self;
using lib::meta::is_UnaryFun;
using lib::meta::is_BinaryFun;
using lib::meta::is_TernaryFun;
@ -240,56 +241,100 @@ namespace engine {
using BuffO = typename ArgO::List::Head;
using BuffI = typename std::conditional<hasInput(), typename ArgI::List::Head, BuffO>::type; /////////////////////////TODO obsolete ... remove after switch
};
/** FeedManifold building block: hold parameter data */
template<class FUN>
struct ParamStorage
{
using ParSig = typename _ProcFun<FUN>::SigP;
ParSig param{};
};
template<class FUN>
struct BufferSlot_Input
{
using BuffS = lib::UninitialisedStorage<BuffHandle, _ProcFun<FUN>::FAN_I>;
using ArgSig = typename _ProcFun<FUN>::SigI;
BuffS inBuff;
ArgSig inArgs{};
};
template<class FUN>
struct BufferSlot_Output
{
using BuffS = lib::UninitialisedStorage<BuffHandle, _ProcFun<FUN>::FAN_O>;
using ArgSig = typename _ProcFun<FUN>::SigO;
BuffS outBuff;
ArgSig outArgs{};
};
template<class X>
using NotProvided = Tagged<lib::meta::NullType, X>;
template<bool yes, class B>
using Provide_if = std::conditional_t<yes, B, NotProvided<B>>;
}//(End)Introspection helpers.
template<class FUN>
struct FeedManifold_StorageSetup
: util::NonCopyable
, BufferSlot_Output<FUN>
, Provide_if<_ProcFun<FUN>::hasInput(), BufferSlot_Input<FUN>>
, Provide_if<_ProcFun<FUN>::hasParam(), ParamStorage<FUN>>
struct _StorageSetup
{
using _Trait = _ProcFun<FUN>;
enum{ FAN_I = _Trait::FAN_I
, FAN_O = _Trait::FAN_O
};
static constexpr bool hasInput() { return _Trait::hasInput(); }
static constexpr bool hasParam() { return _Trait::hasParam(); }
using ParSig = typename _Trait::SigP;
template<size_t fan>
using BuffS = lib::UninitialisedStorage<BuffHandle, fan>;
using BuffI = BuffS<FAN_I>;
using BuffO = BuffS<FAN_O>;
using ArgI = typename _Trait::SigI;
using ArgO = typename _Trait::SigO;
/** FeedManifold building block: hold parameter data */
struct ParamStorage
{
ParSig param;
ParamStorage() = default;
template<typename...INIT>
ParamStorage (INIT&& ...paramInit)
: param{forward<INIT> (paramInit)...}
{ }
};
struct BufferSlot_Input
{
BuffI inBuff;
ArgI inArgs{};
};
struct BufferSlot_Output
{
BuffO outBuff;
ArgO outArgs{};
};
template<typename F>
using enable_if_hasParam = typename lib::meta::enable_if_c<_ProcFun<std::decay_t<F>>::hasParam()>::Type;
template<class X>
using NotProvided = Tagged<lib::meta::NullType, X>;
template<bool yes, class B>
using Provide_if = std::conditional_t<yes, B, NotProvided<B>>;
using FeedOutput = BufferSlot_Output;
using FeedInput = Provide_if<hasInput(), BufferSlot_Input>;
using FeedParam = Provide_if<hasParam(), ParamStorage>;
/**
* Data Storage block for the FeedManifold
* Flexibly configured based on the processing function.
*/
struct Storage
: util::NonCopyable
, FeedOutput
, FeedInput
, FeedParam
{
FUN process;
template<typename F>
Storage (F&& fun)
: process{forward<F> (fun)}
{ }
template<typename F, typename...INIT, typename =disable_if_self<Storage,F>
, typename =enable_if_hasParam<F>>
Storage (F&& fun, INIT&& ...paramInit)
: FeedParam{forward<INIT> (paramInit)...}
, process{forward<F> (fun)}
{ }
};
};
/**
* Adapter to connect input/output buffers to a processing functor backed by an external library.
* Essentially, this is structured storage tailored specifically to a given functor signature.
@ -314,27 +359,23 @@ namespace engine {
template<class FUN>
struct FeedManifold
: FeedManifold_StorageSetup<FUN>
: _StorageSetup<FUN>::Storage
{
using _Trait = _ProcFun<FUN>;
using _F = FeedManifold;
using _S = _StorageSetup<FUN>;
using _F = typename _S::Storage;
static constexpr bool hasInput() { return _Trait::hasInput(); }
static constexpr bool hasParam() { return _Trait::hasParam(); }
/** pass-through constructor */
using _S::Storage::Storage;
using ArgI = typename _Trait::SigI;
using ArgO = typename _Trait::SigO;
enum{ FAN_I = _Trait::FAN_I
, FAN_O = _Trait::FAN_O
using ArgI = typename _S::ArgI;
using ArgO = typename _S::ArgO;
enum{ FAN_I = _S::FAN_I
, FAN_O = _S::FAN_O
};
static constexpr bool hasInput() { return _S::hasInput(); }
static constexpr bool hasParam() { return _S::hasParam(); }
FUN process;
template<typename...INIT>
FeedManifold (INIT&& ...funSetup)
: process{forward<INIT> (funSetup)...}
{ }
template<size_t i, class ARG>
auto&
@ -375,14 +416,34 @@ namespace engine {
invoke()
{
if constexpr (hasInput())
process (_F::inArgs, _F::outArgs);
_F::process (_F::inArgs, _F::outArgs);
else
process (_F::outArgs);
_F::process (_F::outArgs);
}
};
/**
* Builder-Prototype to create FeedManifold instances.
* This »Prototype« becomes part of the Turnout / WeavingPattern
* and holds processing- and parameter-functor instances as configuration.
* The Processing-Functor will be copied into the actual FeedManifold instance
* for each Node invocation.
* @tparam FUN type of the data processing-functor
* @tparam PAM type of an optional parameter-setup functor
*/
template<class FUN, class PAM>
class FeedPrototype
: util::MoveOnly
{
FUN procFun_;
PAM paramFun_;
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1386 : elaborate setup / binding for parameter-creation
};
/**
* Adapter to handle a simple yet common setup for media processing
* - somehow we can invoke processing as a simple function

View file

@ -103,6 +103,7 @@
#include "steam/engine/buffhandle-attach.hpp" /////////////////OOO why do we need to include this? we need the accessAs<TY>() template function
#include "lib/test/test-helper.hpp" ////////////////////////////OOO TODO added for test
#include "lib/format-string.hpp"
#include "lib/iter-zip.hpp"
//#include "lib/util-foreach.hpp"
//#include "lib/iter-adapter.hpp"
//#include "lib/meta/function.hpp"
@ -125,6 +126,7 @@ namespace engine {
// using lib::Literal;
using lib::Several;
using lib::Depend;
using lib::izip;
using util::_Fmt;
using util::max;
@ -238,7 +240,6 @@ namespace engine {
* actual NodeBuilder and PortBuilder allows to introduce extension points
* and helps to abstract away internal technical details of the invocation.
* @tparam POL allocation and context configuration policy
* @tparam N maximum number of input and output slots
* @tparam FUN function or invocation adapter to invoke
*/
template<class POL, class FUN>
@ -346,10 +347,10 @@ namespace engine {
REQUIRE (providers.size() == buffTypes.size());
auto outTypes = DataBuilder<POL, BuffDescr>{leadPorts.policyConnect()}
.reserve (buffTypes.size());
uint i=0;
for (auto& typeConstructor : buffTypes)
for (auto& [i,typeConstructor] : izip(buffTypes))
outTypes.append (
typeConstructor (providers[i++]));
typeConstructor (providers[i]));
ENSURE (leadPorts.size() == FunSpec::FAN_I);
ENSURE (outTypes.size() == FunSpec::FAN_O);

View file

@ -79,21 +79,13 @@ namespace test {
void
verify_FeedManifold()
{
// some random numbers to test...
// Prepare setup to build a suitable FeedManifold...
long r1 = rani(100);
// Prepare setup to build a suitable FeedManifold
using Buffer = long;
/////////////////////////////////////////////////////////////////////////////////TODO
using T1 = tuple<int,double>;
using T2 = array<int*,3>;
using T3 = int;
using T4 = int*;
using T5 = lib::HeteroData<int*,long,double*>;
/////////////////////////////////////////////////////////////////////////////////TODO
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
// Example-1: a FeedManifold to adapt a simple generator function
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
using M1 = FeedManifold<decltype(fun_singleOut)>;
CHECK (not M1::hasInput());
CHECK (not M1::hasParam());
@ -188,17 +180,12 @@ namespace test {
BuffHandle buffI0 = buff;
BuffHandle buffI1 = buffOut;
BuffHandle buffI2 = provider.lockBufferFor<Buffer> (-22);
SHOW_EXPR(buffI0.accessAs<long>())
SHOW_EXPR(buffI1.accessAs<long>())
SHOW_EXPR(buffI2.accessAs<long>())
CHECK (buffI0.accessAs<long>() == r1 ); // (result from Example-1)
CHECK (buffI1.accessAs<long>() == r1+1); // (result from Example-2)
CHECK (buffI2.accessAs<long>() == -55 ); ///////////////////////////////////////OOO should be -22
// prepare a compound buffer and an extra buffer for output...
BuffHandle buffO0 = provider.lockBufferFor<Sequence> (Sequence{-111,-222,-333});
BuffHandle buffO1 = provider.lockBufferFor<Buffer> (-33);
SHOW_EXPR(util::join(buffO0.accessAs<Sequence>()))
SHOW_EXPR(buffO1.accessAs<long>())
CHECK ((buffO0.accessAs<Sequence>() == Sequence{-111,-222,-333}));
CHECK (buffO1.accessAs<long>() == -55 ); ///////////////////////////////////////OOO should be -33
@ -209,20 +196,10 @@ SHOW_EXPR(buffO1.accessAs<long>())
m3.outBuff.createAt(0, buffO0);
m3.outBuff.createAt(1, buffO1);
m3.connect();
SHOW_EXPR(m3.inArgs)
SHOW_EXPR(m3.outArgs)
// Verify data exposed prior to invocation....
auto& [ia0,ia1,ia2] = m3.inArgs;
auto& [oa0,oa1] = m3.outArgs;
auto& [o00,o01,o02] = *oa0;
SHOW_EXPR(ia0)
SHOW_EXPR(ia1)
SHOW_EXPR(ia2)
SHOW_EXPR(oa0)
SHOW_EXPR(o00)
SHOW_EXPR(o01)
SHOW_EXPR(o02)
SHOW_EXPR(oa1)
CHECK (*ia0 == r1 );
CHECK (*ia1 == r1+1);
CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22
@ -232,14 +209,6 @@ SHOW_EXPR(oa1)
CHECK (*oa1 == -55 ); /////////////////////////////////////////////////////OOO should be -33
m3.invoke();
SHOW_EXPR(ia0)
SHOW_EXPR(ia1)
SHOW_EXPR(ia2)
SHOW_EXPR(oa0)
SHOW_EXPR(o00)
SHOW_EXPR(o01)
SHOW_EXPR(o02)
SHOW_EXPR(oa1)
CHECK (*ia0 == r1 ); // Input buffers unchanged
CHECK (*ia1 == r1+1);
CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22

View file

@ -82,9 +82,7 @@
</node>
<node CREATED="1538839170700" ID="ID_172497653" MODIFIED="1582486080773" STYLE="fork">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<b><font color="#288d6e">TODO</font></b>: Infos zusammentragen und dokumentieren
@ -25760,9 +25758,7 @@
</node>
<node CREATED="1563467848565" ID="ID_1150018491" MODIFIED="1576282358069" TEXT="re-Konstruieren m&#xfc;ssen letztlich die TrackPresenter machen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
weil <i>nur sie </i>durch ihren Display-Frame die beiden Kind-Widgets kennen
@ -26446,9 +26442,7 @@
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1582503867646" ID="ID_1320872157" MODIFIED="1582926877646" TEXT="versuchen, das ViewHook-Konzept daf&#xfc;r nutzbar zu machen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
d.h. der Versuch, die Probleme geschickt wegzuabstrahieren.
@ -27066,9 +27060,7 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1677282651864" ID="ID_749202376" MODIFIED="1677282788849" TEXT="Applikation ist robust aber verh&#xe4;llt sich teilweise absonderlich">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Das liegt vielleicht auch an der etwas &#8222;alten&#8220; Version von ca. 2018.
@ -27894,9 +27886,7 @@
</node>
<node CREATED="1677451946578" ID="ID_256050915" MODIFIED="1677452020472" TEXT="hierf&#xfc;r w&#xe4;re eine non-Standard-Konvention notwendig">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...um festzulegen, an welcher Stelle in der Hierarchie dieses Styling definiert ist; allerdings machen wir bereits genau dies f&#252;r die Timeline im Allgemeinen (und zwar genau wegen dem custom-drawing)
@ -29003,9 +28993,7 @@
<icon BUILTIN="clanbomber"/>
<node CREATED="1557446902070" ID="ID_1511315997" MODIFIED="1557498707229" TEXT="kommt davon, wenn man mehrfach polyvalue::EmptyBase verwendet">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
weil n&#228;mlich der Trait, f&#252;r den optimalen Fall, ebenfalls die EmptyBase verwendet, um den Mix-In zu deaktivieren.
@ -30881,9 +30869,7 @@
</node>
<node CREATED="1568577545755" ID="ID_752815491" MODIFIED="1568577574366">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
weil dann <i>innerhalb </i>des Canvas alles konsistent ist
@ -31464,9 +31450,7 @@
<node CREATED="1562969880923" ID="ID_1675178851" MODIFIED="1562969892966" TEXT="damit einen Gtk::StyleContext konfigurieren">
<node COLOR="#338800" CREATED="1562969894183" ID="ID_1066073394" MODIFIED="1563033488691" TEXT="StyleContext per Factory erzeugen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
StyleContext::create()
@ -33078,9 +33062,7 @@
</node>
<node COLOR="#338800" CREATED="1567112357515" FOLDED="true" ID="ID_921918885" MODIFIED="1576282358041" TEXT="man k&#xf6;nnte noch einen Margin pro Track einarbeiten">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -34535,9 +34517,7 @@
</node>
<node CREATED="1661693786231" ID="ID_439776533" MODIFIED="1661693870436" TEXT="vorerst/anfangs zeigt das Clip-Widget einen Content-Platzhalter">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und dieser mu&#223; einfach lokal im UI zu realisieren sein, also ein Stock-Icon und ggfs ein Vektorgraphic-Element
@ -35190,9 +35170,7 @@
<node CREATED="1612471572242" ID="ID_1034906351" MODIFIED="1612471577173" TEXT="hatte es dort sch&#xf6;n versteckt"/>
<node CREATED="1612471577749" ID="ID_1723611368" MODIFIED="1612471646979" TEXT="aber anscheinend ist das doch eine API-Funktion">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es gibt bereits einen <i>S&#252;ndenfall,</i>&#160;n&#228;mlich im RelativeCanvasHook: der mu&#223; delegieren, und daher von au&#223;en diese Methode aufrufen
@ -35683,9 +35661,7 @@
<node CREATED="1477343115357" ID="ID_213954404" MODIFIED="1518487921084" TEXT="Kritik">
<node CREATED="1477343120660" ID="ID_1940152250" MODIFIED="1576282358033" TEXT="Multiplizit&#xe4;t unklar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es sieht so aus, als w&#228;re es &quot;das&quot; WorkspaceWindow
@ -36302,9 +36278,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -51077,9 +51051,7 @@
</node>
<node CREATED="1491694174845" ID="ID_344801148" MODIFIED="1576282357975" TEXT="Instanzbildung geh&#xf6;rt nicht in das Tangible">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
das ist ein grundlegender Beschlu&#223;.
@ -91878,8 +91850,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Die Signatur des Parameter-Funktors folgt eigentlich zwansl&#228;ufig aus der gegebenen Processing-Function: es mu&#223; ein TurnoutSystem&amp; akzeptiert und ein Parameter(Tupel) geliefert werden (by-value). Seiteneffekte im TurnoutSystem sind m&#246;glich (aber die Ausnahme)
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -92098,6 +92069,63 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734226511062" ID="ID_1899717504" MODIFIED="1734226537968" TEXT="ProcFunctor (mandatory)"/>
<node CREATED="1734226564932" ID="ID_696691756" MODIFIED="1734226570322" TEXT="Constructor (static)"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734582866744" ID="ID_1616386454" MODIFIED="1734583016228" TEXT="nochmal restrukturieren: mu&#xdf; nun Param-Tupel durchreichen">
<linktarget COLOR="#c1428c" DESTINATION="ID_1616386454" ENDARROW="Default" ENDINCLINATION="-1351;60;" ID="Arrow_ID_676623897" SOURCE="ID_1465521206" STARTARROW="None" STARTINCLINATION="-527;29;"/>
<icon BUILTIN="pencil"/>
<node COLOR="#5b280f" CREATED="1734583035971" ID="ID_662389818" MODIFIED="1734583156432" TEXT="ich m&#xf6;chte nicht das Param-Tupel nachtr&#xe4;glich zuweisen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...das w&#228;re die <i>billige L&#246;sung:</i>&#160;man erzeugt es einfach immer per Default, und dann macht man im ctor-body in FeedManifold eine conditional und eine Zuweisung. Das ist insofern unsauber, da wir Zuweisbarkeit der Werte im Param-Tupel nicht fordern (sondern nur default-Konstruierbarkeit).
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1734583026544" ID="ID_1494983661" MODIFIED="1734583167914" TEXT="bedeutet: Konstrkutor-Kette und in Basis-Klasse durchreichen"/>
<node CREATED="1734583169204" ID="ID_960536834" MODIFIED="1734583185511" TEXT="das ist schwierig ... weil die Basis-Klasse komplex aufgebaut wird"/>
<node CREATED="1734583186883" ID="ID_445121292" MODIFIED="1734583380956" TEXT="Idee: eine Basis-Klasse &#xbb;Storage&#xab; in einer Konfigurations-Klasse definieren">
<icon BUILTIN="idea"/>
<node CREATED="1734583221142" ID="ID_49260434" MODIFIED="1734583235671" TEXT="also _StorageSetup&lt;FUN&gt; als &#xe4;u&#xdf;erer Container"/>
<node CREATED="1734583236900" ID="ID_63905696" MODIFIED="1734583247122" TEXT="da kann dann alles Metaprogramming rein..."/>
<node CREATED="1734583248433" ID="ID_1335390107" MODIFIED="1734583325076" TEXT="oh ... sogar viel besser, Namespaces bleiben sauber">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...und die neueren Compiler k&#246;nnen sich auch nicht beschweren, da&#223; wir anonyme Typen in die Storage binden, und obendrein sind so die ganzen Meta-Definitionen wirklich downstream nicht mehr sichtbar
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734583328473" ID="ID_1649151484" MODIFIED="1734583342689" TEXT="dann gibt man den Basis-Storage-Modulen explizit Namen"/>
<node CREATED="1734583343988" ID="ID_430940225" MODIFIED="1734583360386" TEXT="und definiert dann erst die nested struct Storage"/>
<node CREATED="1734583361711" ID="ID_568129151" MODIFIED="1734583372909" TEXT="FeedManifold erbt dann von dieser"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734583395510" ID="ID_1700565848" MODIFIED="1734583633132" TEXT="mu&#xdf; dann einen weiteren Ctor auf dieser Basisklasse conditional sichtbar machen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734583422523" ID="ID_907955668" MODIFIED="1734583446849" TEXT="puh .... FEHLER FEHLER FEHLER FEHLER">
<icon BUILTIN="broken-line"/>
</node>
<node CREATED="1734583449376" ID="ID_1289337298" MODIFIED="1734583476552" TEXT="der Compiler pr&#xfc;ft Copy-Konstruktoren"/>
<node CREATED="1734583477904" ID="ID_1284180385" MODIFIED="1734583585790" TEXT="und triggert dabei die Assertion im Traits-Template">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
er versucht n&#228;mlich erst einmal, den getemplateten Ctor mit <i>dem this-type</i>&#160;zu instantiieren. Das ist dann hier F = struct Storage selber. In der enable-if-Klausel bilden wir aber _ProcFun&lt;F&gt; &#8212; und Storage ist ganz offensichtlich keine Funktion und l&#246;st die Assertion aus
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1734583588029" ID="ID_442569333" MODIFIED="1734583600327" TEXT="mu&#xdf; disable_if_self&lt;Storage,F&gt; vorschalten"/>
</node>
<node COLOR="#338800" CREATED="1734583606218" ID="ID_1419317245" MODIFIED="1734583618846" TEXT="compiliert wieder und bestehende Tests laufen....">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1734226618888" ID="ID_758716189" MODIFIED="1734226624083" TEXT="Operationen">
<node CREATED="1734226624933" ID="ID_1270095402" MODIFIED="1734282238319" TEXT="buildFeed(TurnoutSystem&amp;) &#x2014; statisch"/>
<node CREATED="1734226650379" ID="ID_1952959461" MODIFIED="1734226679547" TEXT="connect() &#x2014; bef&#xfc;llt Aufruf-Struktur"/>
@ -92120,6 +92148,166 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734282698342" ID="ID_1166367446" MODIFIED="1734283404476" TEXT="Aufgabe: Konstruktor-Parameter h&#xe4;ngen von der Konfiguration ab">
<linktarget COLOR="#fd0e40" DESTINATION="ID_1166367446" ENDARROW="Default" ENDINCLINATION="-134;6;" ID="Arrow_ID_1369831225" SOURCE="ID_151535815" STARTARROW="None" STARTINCLINATION="-270;14;"/>
<icon BUILTIN="clanbomber"/>
<node CREATED="1734563583763" ID="ID_512213705" MODIFIED="1734572339231" TEXT="tats&#xe4;chlicher Nutz-Kontext">
<arrowlink COLOR="#5958a8" DESTINATION="ID_692448245" ENDARROW="Default" ENDINCLINATION="-2;-498;" ID="Arrow_ID_1679356815" STARTARROW="None" STARTINCLINATION="-480;46;"/>
<icon BUILTIN="idea"/>
<node CREATED="1734563636412" ID="ID_1633090372" MODIFIED="1734563661168" TEXT="im WeavingPattern liegt ein Prototyp der FeedManifold"/>
<node CREATED="1734563662448" ID="ID_1870739425" MODIFIED="1734563678610" TEXT="Instanzen werden &#xfc;ber eine Builder-Funktion erzeugt"/>
<node CREATED="1734563680430" ID="ID_1419855223" MODIFIED="1734563697326" TEXT="die Konfiguration der Funktoren geht bereits in diesen Prototyp/Builder mit ein"/>
</node>
<node CREATED="1734563734735" ID="ID_919421103" MODIFIED="1734572326173" TEXT="Nutz-Muster">
<icon BUILTIN="info"/>
<node CREATED="1734563740806" ID="ID_55877940" MODIFIED="1734563744641" TEXT="Test-Setup">
<node CREATED="1734563746497" ID="ID_423769874" MODIFIED="1734563756595" TEXT="erzeuge den Typ direkt von der Processing-Function"/>
<node CREATED="1734563758051" ID="ID_1385547291" MODIFIED="1734563772102" TEXT="instantiiere per &#xdc;bergabe des Processing-Funktors"/>
</node>
<node CREATED="1734563786196" ID="ID_174357445" MODIFIED="1734563791747" TEXT="Einfache Node">
<node CREATED="1734563799990" ID="ID_871977907" MODIFIED="1734563836213" TEXT="im Prototyen wurde der Processing-Funktor gespeichert"/>
<node CREATED="1734563845192" ID="ID_1992702331" MODIFIED="1734563876039" TEXT="Daten liegen im Port und damit fest in der Render-Node-Storage"/>
<node CREATED="1734563901958" ID="ID_556454787" MODIFIED="1734563930868" TEXT="Instantiierung: Builder kopiert Proc-Functor in den ctor der FeedManifold"/>
</node>
<node CREATED="1734564935899" ID="ID_1063511951" MODIFIED="1734564968427" TEXT="Node mit Parametern">
<node CREATED="1734564996507" ID="ID_1354211229" MODIFIED="1734565011772" TEXT="im Prototypen liegt wieder der Processing-Funktor"/>
<node CREATED="1734565028486" ID="ID_900644106" MODIFIED="1734565043608" TEXT="zus&#xe4;tzlich liegt dort auch ein Param-Funktor"/>
<node CREATED="1734565061765" ID="ID_1265541579" MODIFIED="1734565077412" TEXT="zur Invocation wird der Param-Funktor mit TurnoutSystem&amp; aktiviert"/>
<node CREATED="1734565079168" ID="ID_92417275" MODIFIED="1734565091994" TEXT="er erzeugt ein Parameter-Tupel"/>
<node CREATED="1734565121204" ID="ID_697118762" MODIFIED="1734565138611" TEXT="dieses wird, zusammen mit der Kopie des Processing-Funktors..."/>
<node CREATED="1734565139935" ID="ID_681345521" MODIFIED="1734565517799" TEXT="..in den Konstruktor der FeedManifold gegeben">
<arrowlink COLOR="#fdf5ca" DESTINATION="ID_963615663" ENDARROW="Default" ENDINCLINATION="-108;-6;" ID="Arrow_ID_47883929" STARTARROW="None" STARTINCLINATION="-48;3;"/>
</node>
</node>
</node>
<node CREATED="1734565250264" ID="ID_225480799" MODIFIED="1734572351337" TEXT="Typ-Konfiguration">
<icon BUILTIN="yes"/>
<node CREATED="1734565451406" ID="ID_143803456" MODIFIED="1734565466310">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<i>beide Funktoren</i>&#160;m&#252;ssen in den Typ eingehen
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734565258271" ID="ID_963615663" MODIFIED="1734565519358" TEXT="das Weaving-Pattern ist tats&#xe4;chlich mit dem Prototyp parametrisiert">
<linktarget COLOR="#fdf5ca" DESTINATION="ID_963615663" ENDARROW="Default" ENDINCLINATION="-108;-6;" ID="Arrow_ID_47883929" SOURCE="ID_681345521" STARTARROW="None" STARTINCLINATION="-48;3;"/>
<icon BUILTIN="idea"/>
<node CREATED="1734565328830" ID="ID_497126203" MODIFIED="1734565337641" TEXT="tats&#xe4;chlich war das auch jetzt bereits so"/>
<node CREATED="1734565339027" ID="ID_944000918" MODIFIED="1734565362098" TEXT="nur implizit &#x2014; versteckt in einer std::function&lt;Feed()&gt;"/>
<node CREATED="1734565543377" ID="ID_329042263" MODIFIED="1734572395249" TEXT="k&#xfc;nftig machen wir das nun explizt"/>
<node CREATED="1734565562090" ID="ID_369242440" MODIFIED="1734565578512" TEXT="mit der M&#xf6;glichkeit, weiterhin auf die std::function zur&#xfc;ckzufallen"/>
<node CREATED="1734565580644" ID="ID_1396473921" MODIFIED="1734566898266" TEXT="die Basis-Signatur ist n&#xe4;mlich komplett durch den Proc-Functor determiniert"/>
</node>
<node CREATED="1734566919020" ID="ID_1101989286" MODIFIED="1734567011323" TEXT="bisher wurde ein Konfig-Adapter verwendet">
<node CREATED="1734566950168" ID="ID_763293873" MODIFIED="1734566960359" TEXT="SimpleDirectInvoke&lt;FUN&gt;"/>
<node CREATED="1734566932306" ID="ID_1325175738" MODIFIED="1734566967873" TEXT="dieser verbindet die FeedManifold mit dem Weaving Pattern"/>
<node CREATED="1734566979291" ID="ID_1589137455" MODIFIED="1734567000284" TEXT="effektiv &#xfc;bernimmt der die Rolle des &#xbb;Feed-Prototype&#xab;"/>
<node CREATED="1734568941352" ID="ID_1598999337" MODIFIED="1734568955234" TEXT="Dieser Typ wird per WeavingBuilder injiziert">
<node CREATED="1734568957221" ID="ID_260738975" MODIFIED="1734569007724" TEXT="effektiv ist er ein Typ-Parameter des WeavingBuilders">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
wenngleich auch lediglich indirekt, denn der sichtbare Parameter ist FUN, der Typ der Processing-Function
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734569012990" ID="ID_1162717655" MODIFIED="1734569034684" TEXT="ben&#xf6;tigt wird er allerdings erst im terminalen WeavingBuilder::build()"/>
<node CREATED="1734569036235" ID="ID_356055578" MODIFIED="1734569057978" TEXT="eine Quer-Bewegung zu einem anders parametrisierten WeavingBuilder ist denkbar">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1734569412759" ID="ID_1648744327" MODIFIED="1734569424726">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
neuer Name: <b>FeedPrototype</b>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734569182079" ID="ID_716530363" MODIFIED="1734572949166" TEXT="Konfiguration des Parameter-Funktors &#x27f9; Anpassung des FeedPrototype">
<linktarget COLOR="#7389a1" DESTINATION="ID_716530363" ENDARROW="Default" ENDINCLINATION="203;250;" ID="Arrow_ID_1856006217" SOURCE="ID_1285997694" STARTARROW="None" STARTINCLINATION="611;31;"/>
<node CREATED="1734569230712" ID="ID_707360092" MODIFIED="1734572978459" TEXT="die Typisierung der FeedManifold &#xe4;ndert sich nicht">
<icon BUILTIN="idea"/>
<node CREATED="1734569269794" ID="ID_531521282" MODIFIED="1734569279664" TEXT="FUN bestimmt bereits ob es Parameter geben kann"/>
<node CREATED="1734569281457" ID="ID_1722557648" MODIFIED="1734573061103" TEXT="ob diese tats&#xe4;chlich geliefert werden, entscheidet sich zur Laufzeit">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Wenn es also ein Param-Tupel gibt, entscheidet es sich im Aufruf-Kontext, ob daf&#252;r ein Init-Wert geliefert wird. Wenn nicht, dann findet Default-Initialisierung statt. Ganz einfach
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#d8e6f7" DESTINATION="ID_1722557648" ENDARROW="Default" ENDINCLINATION="-31;231;" ID="Arrow_ID_1230712950" SOURCE="ID_317086869" STARTARROW="None" STARTINCLINATION="584;41;"/>
</node>
</node>
<node CREATED="1734569453419" ID="ID_1669995398" MODIFIED="1734569568926" TEXT="FeedPrototype&lt;FUN, PAM&gt; tr&#xe4;gt einen zweiten Typ-Parameter mit Default"/>
<node CREATED="1734569570274" ID="ID_595899197" MODIFIED="1734569581727" TEXT="dieser Default schaltet die Funktion inaktiv"/>
<node CREATED="1734570195885" ID="ID_585558138" MODIFIED="1734570216244" TEXT="Quer-Konfiguration &#xe4;ndert diesen Parameter">
<node CREATED="1734570301575" ID="ID_1921770646" MODIFIED="1734570323016" TEXT="der Funktor PAM wird Teil des FeedPrototype"/>
<node CREATED="1734570324580" ID="ID_1090355756" MODIFIED="1734570342701" TEXT="&#x27f9; er hat einen Einflu&#xdf; auf die Gr&#xf6;&#xdf;e des Turnout"/>
<node CREATED="1734570348593" ID="ID_550976299" MODIFIED="1734570361044" TEXT="man kann hier eine std::function konfigurieren">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734570400410" ID="ID_1801036136" MODIFIED="1734570504358" TEXT="wichtige Stellschraube bzgl. Template-Bloat">
<arrowlink COLOR="#ccf6fe" DESTINATION="ID_362452179" ENDARROW="Default" ENDINCLINATION="394;22;" ID="Arrow_ID_85243891" STARTARROW="None" STARTINCLINATION="531;31;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1734570519650" ID="ID_394458547" MODIFIED="1734570565328" TEXT="sollte transparent durchgereicht werden"/>
<node CREATED="1734570547303" ID="ID_1642455577" MODIFIED="1734570561425" TEXT="diese Entscheidung f&#xe4;llt auf Builder-Level-3"/>
</node>
<node CREATED="1734570789216" ID="ID_1930522792" MODIFIED="1734570828093" TEXT="&#xc4;nderung statisch oder dynamisch">
<node CREATED="1734570830057" ID="ID_1130515747" MODIFIED="1734570840417" TEXT="statisch: Typ-Rebuilder vorsehen"/>
<node CREATED="1734570841739" ID="ID_249540590" MODIFIED="1734571090344" TEXT="dynamisch: eine builder-Notation">
<arrowlink COLOR="#8664dc" DESTINATION="ID_1598621193" ENDARROW="Default" ENDINCLINATION="146;8;" ID="Arrow_ID_1851715816" STARTARROW="None" STARTINCLINATION="-26;75;"/>
</node>
</node>
</node>
</node>
<node CREATED="1734570896593" ID="ID_120832684" MODIFIED="1734570960763" TEXT="konstruiert wird der FeedPrototype erst im Turnout">
<node CREATED="1734570911997" ID="ID_38791432" MODIFIED="1734570967377" TEXT="das Turnout reicht &#xfc;bersch&#xfc;ssige Parameter an den Prototype durch">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1734570969165" ID="ID_141488084" MODIFIED="1734571034489" TEXT="Konstruktor-Varianten">
<node CREATED="1734571048323" ID="ID_1598621193" MODIFIED="1734571081585" TEXT="Move-ctor: bestehende Prototyp-Konfig &#xfc;bernehmen">
<linktarget COLOR="#8664dc" DESTINATION="ID_1598621193" ENDARROW="Default" ENDINCLINATION="146;8;" ID="Arrow_ID_1851715816" SOURCE="ID_249540590" STARTARROW="None" STARTINCLINATION="-26;75;"/>
</node>
<node CREATED="1734571114213" ID="ID_43601788" MODIFIED="1734571251260" TEXT="beide Funktoren explizit per Value gegeben"/>
<node CREATED="1734571350714" ID="ID_108774551" MODIFIED="1734571363533" TEXT="nur der Proc-Functor explizit per Value gegeben">
<node CREATED="1734572263295" ID="ID_1485061295" MODIFIED="1734572273442" TEXT="das entspricht der aktuell implementieren L&#xf6;sung"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734572275188" ID="ID_534914797" MODIFIED="1734572295035" TEXT="der Proc-Functor mu&#xdf; dann default-konstruierbar sein">
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734572306537" ID="ID_1442022066" MODIFIED="1734572315772" TEXT="Implementierung schrittweise aufbauen">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734572424754" ID="ID_1186353623" MODIFIED="1734582798770" TEXT="Typ anlegen mit zwei Funktor-Parametern">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572571310" ID="ID_762884176" MODIFIED="1734572593981" TEXT="Traits-Template f&#xfc;r Parmeter-Funktor vorsehen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572439920" ID="ID_955026014" MODIFIED="1734573339521" TEXT="createFeed (TurnoutSystem&amp;) implementieren">
<linktarget COLOR="#d35582" DESTINATION="ID_955026014" ENDARROW="Default" ENDINCLINATION="-620;38;" ID="Arrow_ID_278216824" SOURCE="ID_112390056" STARTARROW="None" STARTINCLINATION="1203;53;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572530013" ID="ID_765842112" MODIFIED="1734572593980" TEXT="dynamische quer-Builder hinzuf&#xfc;gen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572553754" ID="ID_155507222" MODIFIED="1734572593980" TEXT="Konstruktor bereitstellen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734196584853" ID="ID_1949228582" MODIFIED="1734283386060" TEXT="Anordnung des Parameters f&#xfc;r den Param-Funktor bedenken">
@ -92153,6 +92341,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
<arrowlink COLOR="#fd0e40" DESTINATION="ID_1166367446" ENDARROW="Default" ENDINCLINATION="-134;6;" ID="Arrow_ID_1369831225" STARTARROW="None" STARTINCLINATION="-270;14;"/>
<node CREATED="1734572764400" ID="ID_317086869" MODIFIED="1734573061103" TEXT="wird komplett von FeedManifold getrennt">
<arrowlink COLOR="#d8e6f7" DESTINATION="ID_1722557648" ENDARROW="Default" ENDINCLINATION="-31;231;" ID="Arrow_ID_1230712950" STARTARROW="None" STARTINCLINATION="584;41;"/>
</node>
<node CREATED="1734572775907" ID="ID_1285997694" MODIFIED="1734572955141">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
&#10233; geht in eine <u>Builder-Klasse</u>&#160;<font color="#392ebf" face="Monospaced"><b>FeedPrototype</b></font><font color="#8a7979" face="Monospaced">&lt;</font><font color="#ab020a" face="Monospaced">FUN</font><font color="#8a7979" face="Monospaced">,</font><font color="#ba3b76" face="Monospaced">PAM</font><font color="#8a7979" face="Monospaced">&gt;</font>
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#7389a1" DESTINATION="ID_716530363" ENDARROW="Default" ENDINCLINATION="203;250;" ID="Arrow_ID_1856006217" STARTARROW="None" STARTINCLINATION="611;31;"/>
</node>
</node>
</node>
</node>
@ -92508,6 +92711,36 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133400400" ID="ID_1364724277" MODIFIED="1734141875620" TEXT="zus&#xe4;tzlichen Funktor f&#xfc;r die Parameter akzeptieren">
<arrowlink COLOR="#c0023e" DESTINATION="ID_1127056731" ENDARROW="Default" ENDINCLINATION="-1257;-48;" ID="Arrow_ID_1717201620" STARTARROW="None" STARTINCLINATION="-908;50;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1734562038955" ID="ID_692448245" MODIFIED="1734572339232" TEXT="Aufruf-Situation bedenken">
<linktarget COLOR="#5958a8" DESTINATION="ID_692448245" ENDARROW="Default" ENDINCLINATION="-2;-498;" ID="Arrow_ID_1679356815" SOURCE="ID_512213705" STARTARROW="None" STARTINCLINATION="-480;46;"/>
<icon BUILTIN="yes"/>
<node CREATED="1734562056147" ID="ID_1008097228" MODIFIED="1734562079441">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
in den Turnout wird ein <b>Prototyp</b> der FeedManifold eingebettet
</p>
</body>
</html>
</richcontent>
<node CREATED="1734562117362" ID="ID_462941923" MODIFIED="1734562132362" TEXT="die gebundene Adapter/Processing-Function steckt hier"/>
<node CREATED="1734562133675" ID="ID_332757580" MODIFIED="1734562147837" TEXT="das kann auch versteckte Binding-Daten mit beinhalten"/>
</node>
<node CREATED="1734562080880" ID="ID_206914941" MODIFIED="1734562105499" TEXT="f&#xfc;r jede Node-Invocation wird daraus die FeedManifold in den Stack-Frame konstruiert"/>
<node CREATED="1734562339836" ID="ID_358292961" MODIFIED="1734562369484" TEXT="ausgel&#xf6;st wird das aus dem WeavingPattern &#x2014; aber ohne jedwede Kenntisse zur Konfiguration"/>
<node CREATED="1734562402763" ID="ID_393302864" MODIFIED="1734562449071" TEXT="f&#xfc;r Tests ist es sinnvoll, FeedManifold direkt zu erzeugen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
das hei&#223;t, idealerweise ist dieses ganze komplexe Konfigurations-Thema optional und transparent
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734388801494" ID="ID_1469272212" MODIFIED="1734389073266" TEXT="Hier k&#xf6;nnte ein Buffer-Typ-Konstruktor mit eingebunden werden">
<icon BUILTIN="hourglass"/>
<node BACKGROUND_COLOR="#e2be92" CREATED="1734388824979" ID="ID_1655919747" MODIFIED="1734389385989" TEXT="dieses Thema tauchte im Design immer wieder auf">
@ -92524,7 +92757,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734196306235" ID="ID_1975026226" MODIFIED="1734196338552" TEXT="Funktor geht mit in den Turnout-Typ ein">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1734196346326" ID="ID_362452179" MODIFIED="1734196435265" TEXT="std::function hier kann Template-Bloat reduzieren">
<node CREATED="1734196346326" ID="ID_362452179" MODIFIED="1734570504358" TEXT="std::function hier kann Template-Bloat reduzieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -92533,6 +92766,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#ccf6fe" DESTINATION="ID_362452179" ENDARROW="Default" ENDINCLINATION="394;22;" ID="Arrow_ID_85243891" SOURCE="ID_1801036136" STARTARROW="None" STARTINCLINATION="531;31;"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734196763636" ID="ID_1457253482" MODIFIED="1734196896465" TEXT="tats&#xe4;chliche Wirksamkeit h&#xe4;ngt von realem Nutzen ab">
<arrowlink COLOR="#7d7fd1" DESTINATION="ID_640106632" ENDARROW="Default" ENDINCLINATION="126;7;" ID="Arrow_ID_1055059428" STARTARROW="None" STARTINCLINATION="131;7;"/>
@ -92554,6 +92788,32 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573094180" HGAP="-9" ID="ID_276469818" MODIFIED="1734573194733" TEXT="FeedManifold wird davon unabh&#xe4;ngig" VSHIFT="18">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1734573105647" ID="ID_1068459719" MODIFIED="1734573366211" TEXT="ist allein durch den ProcessingFunctor bestimmt">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573119398" ID="ID_112390056" MODIFIED="1734573353430" TEXT="wird erst zur Laufzeit von einem FeedPrototype(Builder) erzeugt">
<arrowlink COLOR="#35a1d3" DESTINATION="ID_1416331336" ENDARROW="Default" ENDINCLINATION="420;24;" ID="Arrow_ID_1552949599" STARTARROW="None" STARTINCLINATION="245;11;"/>
<arrowlink COLOR="#d35582" DESTINATION="ID_955026014" ENDARROW="Default" ENDINCLINATION="-620;38;" ID="Arrow_ID_278216824" STARTARROW="None" STARTINCLINATION="1203;53;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1734573135923" ID="ID_1817637241" LINK="#ID_1722557648" MODIFIED="1734573174846">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
bekommt ggfs. ein zus&#228;tzliches Parameter-Tupel <i>als ctor-Wert</i>
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734582923838" ID="ID_1465521206" MODIFIED="1734583016228" TEXT="mu&#xdf; daf&#xfc;r nochmal Definitions-Struktur umkrempeln">
<arrowlink COLOR="#c1428c" DESTINATION="ID_1616386454" ENDARROW="Default" ENDINCLINATION="-1351;60;" ID="Arrow_ID_676623897" STARTARROW="None" STARTINCLINATION="-527;29;"/>
<icon BUILTIN="pencil"/>
</node>
</node>
</node>
<node CREATED="1734309978110" ID="ID_436098074" MODIFIED="1734309987990" TEXT="umgebaute FeedManifold testen...">
<node COLOR="#5b280f" CREATED="1734310000123" ID="ID_1140187367" MODIFIED="1734310088299" TEXT="der alte BuffTable_test ist unpassend &#x2014; weg damit">
@ -92572,6 +92832,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#16a2aa" DESTINATION="ID_1710382999" ENDARROW="Default" ENDINCLINATION="539;-32;" ID="Arrow_ID_129574515" SOURCE="ID_1348489291" STARTARROW="None" STARTINCLINATION="183;11;"/>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573209952" ID="ID_1416331336" MODIFIED="1734573261692" TEXT="FeedPrototype in separatem Testfall abhandeln">
<linktarget COLOR="#35a1d3" DESTINATION="ID_1416331336" ENDARROW="Default" ENDINCLINATION="420;24;" ID="Arrow_ID_1552949599" SOURCE="ID_112390056" STARTARROW="None" STARTINCLINATION="245;11;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133441531" ID="ID_109108903" MODIFIED="1734133509736" TEXT="Turnout-System mit Storage implementieren">