Invocation: integrate active ''parameter functor''

While basically the `FeedPrototype` could be created directly,
passing both the processing- and the parameter-functor, in practice
a two-step configuration can be expected, since the processing-functor
is built by the Library-Plug-in, while the parameter-functor is then
later added as decoration by the builder.

Thus we need the ability to ''collect configuration'' within the Level-2 builder,
which can be achieved by a ''cross-builder'' mechanic, where we create an adapted builder
from the augmented configuration. A similar approach is also used to add
the configuration of the custom allocator.

Added an extensive demo in the test, playing with several instances
to highlight the point where the parameter-functor is actually invoked.
This commit is contained in:
Fischlurch 2024-12-20 07:05:43 +01:00
parent 8923d0f7b5
commit 72703f70c9
3 changed files with 210 additions and 88 deletions

View file

@ -263,7 +263,7 @@ namespace engine {
static constexpr bool hasParam() { return _Proc::hasParam(); }
using Param = std::conditional_t<hasParam(), typename _Proc::ArgP, std::tuple<>>;
using Param = std::conditional_t<hasParam(), typename _Proc::SigP, std::tuple<>>;
template<class PF>
using Res = typename _Fun<PF>::Ret;
@ -569,7 +569,7 @@ namespace engine {
, paramFun_{move (par)}
{ }
// default move acceptable : pass pre-established setup
static constexpr bool hasParam() { return _Trait::hasParam(); }
static constexpr bool hasParamFun() { return _Trait::template isParamFun<PAM>(); }
static constexpr bool canActivate() { return _Trait::template canActivate<PAM>(); }
@ -582,9 +582,30 @@ namespace engine {
{
if constexpr (hasParamFun())
if (_Trait::isActivated(paramFun_))
return Feed{paramFun_(turnoutSys), procFun_};
return Feed(paramFun_(turnoutSys), procFun_);
return Feed{procFun_};
}
template<typename PFX>
using Adapted = FeedPrototype<FUN, PFX>;
/**
* Cross-Builder to add configuration with a given parameter-functor.
* @return new FeedPrototype instance outfitted with the current
* processing-functor and the given other param-functor
* @warning the current instance is likely **defunct** after this call,
* and should not be used any more, due to the move-construct.
* @remark together with the move-ctor of FeedPrototype this helper
* can be used to configure a Prototype in several steps.
*/
template<typename PFX>
auto
moveAdapted (PFX otherParamFun)
{
using OtherParamFun = std::decay_t<PFX>;
return Adapted<OtherParamFun>{move(procFun_), move(otherParamFun)};
}
};

View file

@ -328,7 +328,6 @@ namespace test {
verify_FeedPrototype()
{
// Prepare setup to build a suitable FeedManifold...
long r1 = rani(100);
using Buffer = long;
BufferProvider& provider = DiagnosticBufferProvider::build();
BuffHandle buff = provider.lockBufferFor<Buffer> (-55);
@ -336,24 +335,66 @@ namespace test {
auto fun_singleParamOut = [](short param, Buffer* buff) { *buff = param-1; };
using M1 = FeedManifold<decltype(fun_singleParamOut)>;
using P1 = M1::Prototype;
CHECK ( P1::hasParam());
CHECK (not P1::hasParamFun());
CHECK ( P1::hasParam()); // checks that the processing-function accepts a parameter
CHECK (not P1::hasParamFun()); // while this prototype has no active param-functor
CHECK (not P1::canActivate());
P1 p1{move (fun_singleParamOut)};
P1 p1{move (fun_singleParamOut)}; // create the instance of the prototype, moving the functor in
CHECK (sizeof(p1) <= sizeof(void*));
TurnoutSystem turSys{Time::NEVER};
TurnoutSystem turSys{Time::NEVER}; // Each Node invocation uses a TurnoutSystem instance....
M1 m1 = p1.createFeed(turSys);
CHECK (m1.param == short{});
m1.outBuff.createAt(0, buff);
M1 m1 = p1.createFeed(turSys); //... and also will create a new FeedManifold from the prototype
CHECK (m1.param == short{}); // In this case here, the param value is default constructed.
m1.outBuff.createAt(0, buff); // Perform the usual steps for an invocation....
CHECK (buff.accessAs<long>() == -55);
m1.connect();
CHECK (*m1.outArgs == -55);
m1.invoke();
CHECK (*m1.outArgs == 0 - 1);
CHECK (*m1.outArgs == 0 - 1); // fun_singleParamOut() -> param - 1 and param ≡ 0
CHECK (buff.accessAs<long>() == 0 - 1);
long& calcResult = buff.accessAs<long>(); // for convenience use a reference into the result buffer
//_____________________________________
// Reconfigure to attach a param-functor
long rr{11}; // ▽▽▽▽ Note: side-effect
auto fun_paramSimple = [&](TurnoutSystem&){ return rr += 1+rani(100); };
using P1x = P1::Adapted<decltype(fun_paramSimple)>;
CHECK ( P1x::hasParam());
CHECK ( P1x::hasParamFun());
CHECK (not P1x::canActivate());
P1x p1x = p1.moveAdapted (move(fun_paramSimple));
M1 m1x = p1x.createFeed(turSys); // ◁————————— param-functor invoked here
CHECK (rr == m1x.param); // ...as indicated by the side-effect
short r1 = m1x.param;
// the rest works as always with FeedManifold (which as such is agnostic of the param-functor!)
m1x.outBuff.createAt(0, buff);
m1x.connect();
m1x.invoke(); // Invoke the processing functor
CHECK (calcResult == r1 - 1); // ...which computes fun_singleParamOut() -> param-1
// but let's play with the various instances...
m1.invoke(); // the previous FeedManifold is sill valid and connected
CHECK (calcResult == 0 - 1); // and uses its baked in parameter value (0)
m1x.invoke();
CHECK (calcResult == r1 - 1); // as does m1x, without invoking the param-functor
// create yet another instance from the prototype...
M1 m1y = p1x.createFeed(turSys); // ◁————————— param-functor invoked here
CHECK (rr == m1y.param);
CHECK (r1 < m1y.param); // ...note again the side-effect
m1y.outBuff.createAt(0, buff);
m1y.connect();
m1y.invoke(); // ...and so this third FeedManifold instance...
CHECK (calcResult == rr - 1); // uses yet another baked-in param value;
m1x.invoke(); // recall that each Node invocation creates a new
CHECK (calcResult == r1 - 1); // FeedManifold on the stack, since invocations are
m1.invoke(); // performed concurrently, each with its own set of
CHECK (calcResult == 0 - 1); // buffers and parameters.
}
};

View file

@ -26939,9 +26939,7 @@
<node CREATED="1677242750955" ID="ID_1710116847" MODIFIED="1677242765269" TEXT="der bietet eins symbolische Notation, aber nirgends die Zahlenwerte"/>
<node CREATED="1677243712139" ID="ID_175318062" MODIFIED="1677243737909" TEXT="man kann einzelne Objekte per Zuweisung redefinieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
b = 0.6180339887498948482
@ -27630,9 +27628,7 @@
</node>
<node CREATED="1678058960509" ID="ID_755126006" MODIFIED="1678059095895" TEXT="anscheinend eine Kombination mehrerer Fehler in der Layout-Logik">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -28112,9 +28108,7 @@
</node>
<node CREATED="1677775842668" ID="ID_178604932" LINK="https://www.cairographics.org/tutorial/#L1transforms" MODIFIED="1677776018897" TEXT="Nein! Laut Doku ist initial der User-Space identisch mit dem Device-Space">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
The device-space coordinate system is tied to the surface, and cannot change. The user-space coordinate system
@ -28873,9 +28867,7 @@
<node CREATED="1555807297726" ID="ID_1905059435" MODIFIED="1557498707229" TEXT="das w&#xe4;re heute gar nicht mehr notwendig"/>
<node CREATED="1555807489204" ID="ID_1385287282" MODIFIED="1557498707229" TEXT="Ausf&#xfc;hrung ist l&#xfc;ckenhaft, und teilweise nicht korrekt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Beispiel: Wenn der Typ selber keinen Support anbietet,
@ -28908,9 +28900,7 @@
<node CREATED="1555807724232" ID="ID_1817680115" MODIFIED="1557498707229" TEXT="und das, obwohl ich CloneValueSupport als Basis verwendet habe"/>
<node CREATED="1557446452899" ID="ID_454930922" MODIFIED="1557498707229" TEXT="META_DETECT_FUNCTION erkennt keine geerbten Methoden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...denn diese Duck-Detector-Metafunktion bildet den <b>Typ</b>&#160;eines Member-Pointers,
@ -30202,9 +30192,7 @@
</node>
<node COLOR="#435e98" CREATED="1566487282848" ID="ID_771271362" MODIFIED="1672875017148" TEXT="Workaround: jeweils explizit set_size_request">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<u>Anmerkung 1/2023</u>: seinerzeit habe ich die Mechanik der Layout-Zuteilung noch nicht wirklich verstanden
@ -31593,9 +31581,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1563117450249" ID="ID_36783315" MODIFIED="1563117529819">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
spezielle Regel gesetzt auf: <b>.timeline-page &gt; .timeline-body fork.timeline</b>
@ -32945,9 +32931,7 @@
<node CREATED="1567085512476" ID="ID_1140063837" MODIFIED="1567085514964" TEXT="warum?"/>
<node CREATED="1567085515823" ID="ID_224781783" MODIFIED="1576282358042" TEXT="weil wir sp&#xe4;ter Clips in den Track platzieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
d.h. wir m&#252;ssen...
@ -33686,9 +33670,7 @@
</node>
<node CREATED="1678063155834" ID="ID_774623134" MODIFIED="1679073584761" TEXT="ein Problem k&#xf6;nnte die Verteilung zus&#xe4;tzlcher vertikaler Ausdehnung sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...dar&#252;ber bin ich auch beim Zeichnen der Connector im StaveBracket gestolpert
@ -33876,9 +33858,7 @@
<icon BUILTIN="yes"/>
<node CREATED="1583679312741" ID="ID_440797673" MODIFIED="1584108642018" TEXT="dediziertes Clip-API">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -34580,9 +34560,7 @@
<icon BUILTIN="flag-yellow"/>
<node CREATED="1584229580470" ID="ID_1095483529" MODIFIED="1584229645233" TEXT="Effekt/Medienspur">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...diese erstreckt sich typischerweise &#252;ber die gesamte L&#228;nge des umschlie&#223;enden Containers, und pa&#223;t sich dieser ohne weiteres dynamisch an
@ -34960,9 +34938,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1611492890873" ID="ID_458756808" MODIFIED="1611492956892" TEXT="sollte in der seit 4/20 existierenden Implementierung bereits funktionieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...habe ich aber noch nie getestet...
@ -88756,8 +88732,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
auch Implementierung von <font face="Monospaced" color="#750db9">all_buffers_released</font><font face="Monospaced">()</font>&#160;fehlt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -88765,8 +88740,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Glorreich &#8212; <i>testgetriebene Entwicklung</i>&#160;und dann den wichtigen zentralen Test &gt;10 Jahre lang auskommentiert rumstehen lassen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="smiley-angry"/>
</node>
<node COLOR="#862e72" CREATED="1734657284816" ID="ID_273646931" MODIFIED="1734657328403" TEXT="Hilfe! alles ziemlich komplex ... verstehe nur ungef&#xe4;hr...">
@ -88792,8 +88766,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
also mu&#223; ich im BlockPool alles als <i>released</i>&#160;markieren
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1734657650997" ID="ID_597301148" MODIFIED="1734657671746" TEXT="die BufferMetadat-Registry zeigt auch noch eine Warnung an">
@ -88837,6 +88810,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1734657789598" ID="ID_452572995" LINK="#ID_189910811" MODIFIED="1734658019920" TEXT="aufrufen ohne Parameter">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1734673688080" ID="ID_1753930029" LINK="#ID_154709521" MODIFIED="1734673731126" TEXT="mit Param-Functor im Prototype">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
@ -91653,8 +91629,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734197949703" ID="ID_614756914" MODIFIED="1734299449717" TEXT="in zwei Schritten umstellen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734197949703" ID="ID_614756914" MODIFIED="1734662069545" TEXT="in zwei Schritten umstellen">
<icon BUILTIN="yes"/>
<node COLOR="#338800" CREATED="1734197960677" ID="ID_928664533" MODIFIED="1734299248635" TEXT="Schritt-1 : neues Interface">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1734198655392" ID="ID_1607922853" MODIFIED="1734213039477" TEXT="kann ArgI|O sofort umbenennen &#x27fc; SigI|O">
@ -91695,17 +91671,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1734213045001" ID="ID_787577161" MODIFIED="1734213055524" TEXT="sonstige Signatur bereits anlegen"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734197971763" ID="ID_1977596531" MODIFIED="1734299442669" TEXT="Schritt-2 : tats&#xe4;chliche Flexibilit&#xe4;t">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734197971763" ID="ID_1977596531" MODIFIED="1734662057423" TEXT="Schritt-2 : tats&#xe4;chliche Flexibilit&#xe4;t">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1734214199422" ID="ID_525858909" MODIFIED="1734299260472" TEXT="stellt sich wieder (zum x-ten Mal) die Frage nach dem Layout der FeedManifold">
<arrowlink COLOR="#2e2c57" DESTINATION="ID_1045815708" ENDARROW="Default" ENDINCLINATION="-98;-400;" ID="Arrow_ID_639104343" STARTARROW="None" STARTINCLINATION="-367;14;"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734299273886" ID="ID_1992832073" MODIFIED="1734550631972" TEXT="intern mehrstufig aufgebaut">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734299273886" ID="ID_1992832073" MODIFIED="1734661912333" TEXT="intern mehrstufig aufgebaut">
<icon BUILTIN="button_ok"/>
<node CREATED="1734299304455" ID="ID_286097173" MODIFIED="1734299376662" TEXT="Trait zur Fallunterscheidung">
<arrowlink COLOR="#8e8fa7" DESTINATION="ID_978315882" ENDARROW="Default" ENDINCLINATION="52;169;" ID="Arrow_ID_793891080" STARTARROW="None" STARTINCLINATION="-331;-17;"/>
</node>
<node CREATED="1734299287036" ID="ID_675651825" MODIFIED="1734299411972" TEXT="Trait zur Klassifikation eines Arguments">
<node COLOR="#5b280f" CREATED="1734299287036" FOLDED="true" ID="ID_675651825" MODIFIED="1734662032806" TEXT="Trait zur Klassifikation eines Arguments">
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="forward"/>
<node CREATED="1734299588563" ID="ID_1171470327" MODIFIED="1734299593079" TEXT="Hilfsmittel">
<node CREATED="1734299594621" ID="ID_1652085011" MODIFIED="1734299598721" TEXT="is_Value">
<node CREATED="1734299796014" ID="ID_91717467" MODIFIED="1734299803280" TEXT="keine Referenz">
@ -91811,6 +91789,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734550451183" ID="ID_1408787596" MODIFIED="1734550469001" TEXT="sonstige Logik direkt auf Parameter-Eigenschafuten aufgebaut"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1734661921178" ID="ID_616834002" MODIFIED="1734661998251" TEXT="Ergebnis: brauche gar keine &#xbb;Klassifikation eienes Arguments&#xab; mehr">
<arrowlink COLOR="#f8f2c0" DESTINATION="ID_352066932" ENDARROW="Default" ENDINCLINATION="1559;-1127;" ID="Arrow_ID_1251018017" STARTARROW="None" STARTINCLINATION="641;26;"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1734662010846" ID="ID_895926165" MODIFIED="1734662030273" TEXT="damit aber trotzdem die Fundemente bereitgestellt">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1734458417453" ID="ID_1458239434" MODIFIED="1734458430809" TEXT="struktuierte Argumente korrekt klassifizieren">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734458433484" ID="ID_569916262" MODIFIED="1734458448795" TEXT="Frage: wie umgehen mit leeren Strukturen?">
@ -91872,7 +91857,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1734299615144" ID="ID_1061968970" MODIFIED="1734299633817" TEXT="Umgang mit komplexen Argumenten">
<node COLOR="#338800" CREATED="1734299615144" ID="ID_1061968970" MODIFIED="1734662054769" TEXT="Umgang mit komplexen Argumenten">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1734299635613" ID="ID_1256304259" MODIFIED="1734299646473" TEXT="Fallunterscheidung Tupel und Array">
<icon BUILTIN="button_cancel"/>
</node>
@ -91902,14 +91888,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734190947370" ID="ID_765080280" MODIFIED="1734191007258" TEXT="FeedManifold umstellen: std::array &#x27fc; tuple">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734191532632" ID="ID_503276878" MODIFIED="1734191554354" TEXT="damit f&#xe4;llt eine starke strukturelle Einschr&#xe4;nkung weg">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734191532632" FOLDED="true" ID="ID_503276878" MODIFIED="1734661895753" TEXT="damit f&#xe4;llt eine starke strukturelle Einschr&#xe4;nkung weg">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1734191556277" ID="ID_93980686" MODIFIED="1734191564434" TEXT="nicht klar ob das vorteilhaft ist"/>
<node CREATED="1734191682679" ID="ID_1626382774" MODIFIED="1734191699892" TEXT="ich wollte mit dem einheitlichen N die Zahl der Template-Instanzen begrenzen">
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734191801095" ID="ID_438353051" MODIFIED="1734191897064" TEXT="Template-Bloat stellt tas&#xe4;chlich eine Gefahr dar">
<node COLOR="#5b280f" CREATED="1734191682679" FOLDED="true" ID="ID_1626382774" MODIFIED="1734661878132" TEXT="ich wollte mit dem einheitlichen N die Zahl der Template-Instanzen begrenzen">
<icon BUILTIN="button_cancel"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734191801095" ID="ID_438353051" MODIFIED="1734661870055" TEXT="Template-Bloat stellt tas&#xe4;chlich eine Gefahr dar">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734191857809" ID="ID_1485766208" MODIFIED="1734191891221" TEXT="stelle aber fest: zusammen mit N geht &#xfc;berall der Typ FUN mit ein">
<node COLOR="#435e98" CREATED="1734191857809" ID="ID_1485766208" MODIFIED="1734661866138" TEXT="stelle aber fest: zusammen mit N geht &#xfc;berall der Typ FUN mit ein">
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1734192098399" ID="ID_1972074994" MODIFIED="1734192158004">
@ -91984,7 +91971,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1734199120857" ID="ID_1343294838" MODIFIED="1734199129917" TEXT="kl&#xe4;ren: was wird gespeichert?">
<node COLOR="#435e98" CREATED="1734199120857" FOLDED="true" ID="ID_1343294838" MODIFIED="1734661850736" TEXT="kl&#xe4;ren: was wird gespeichert?">
<node CREATED="1734199131568" ID="ID_1360177084" MODIFIED="1734199142001" TEXT="aktuell speichern wir ein Array von BuffHandle"/>
<node CREATED="1734199150589" ID="ID_974879606" MODIFIED="1734199175846" TEXT="das wird dann im invoke()-Aufruf &#xfc;bersetzt (&#x27fc; dereferenziert)">
<node CREATED="1734199263294" ID="ID_1017649830" MODIFIED="1734199276945" TEXT="hab dazu zus&#xe4;tzliche Storage im InvocationAdapter"/>
@ -92104,7 +92091,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734226596427" ID="ID_1730595360" MODIFIED="1734397856015" TEXT="Struktur neu aufbauen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734226295084" ID="ID_43554059" MODIFIED="1734483723539" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
<node COLOR="#338800" CREATED="1734226295084" FOLDED="true" ID="ID_43554059" MODIFIED="1734661778696" TEXT="FeedManifold wird aus mehreren Layern zusammengesetzt">
<icon BUILTIN="button_ok"/>
<node CREATED="1734226447447" ID="ID_1121321956" MODIFIED="1734226473215" TEXT="Param-Storage (optional)"/>
<node CREATED="1734226474754" ID="ID_334989563" MODIFIED="1734226483630" TEXT="Input-Storage (optional)"/>
@ -92112,9 +92099,9 @@ 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="1734634929289" TEXT="nochmal restrukturieren: mu&#xdf; nun Param-Tupel durchreichen">
<node COLOR="#435e98" CREATED="1734582866744" FOLDED="true" ID="ID_1616386454" MODIFIED="1734661773085" TEXT="nochmal restrukturieren: mu&#xdf; nun Param-Tupel durchreichen">
<linktarget COLOR="#427ec1" DESTINATION="ID_1616386454" ENDARROW="Default" ENDINCLINATION="-1351;60;" ID="Arrow_ID_676623897" SOURCE="ID_1465521206" STARTARROW="None" STARTINCLINATION="-531;27;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="yes"/>
<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/>
@ -92129,6 +92116,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<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 BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1734583186883" ID="ID_445121292" MODIFIED="1734634891132" TEXT="Idee: eine Basis-Klasse &#xbb;Storage&#xab; in einer Konfigurations-Klasse definieren">
<linktarget COLOR="#708ea5" DESTINATION="ID_445121292" ENDARROW="Default" ENDINCLINATION="-35;127;" ID="Arrow_ID_1651811667" SOURCE="ID_1910773324" STARTARROW="None" STARTINCLINATION="135;10;"/>
<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..."/>
@ -92222,24 +92210,29 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1734631663263" ID="ID_1915555663" MODIFIED="1734631703467" TEXT="demonstriere auch reinen Output mit Parameter"/>
</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"/>
<node CREATED="1734226680799" ID="ID_435218687" MODIFIED="1734226694521" TEXT="invoke() &#x2014; f&#xfc;hrt ProcFun aus"/>
<node CREATED="1734226618888" ID="ID_758716189" MODIFIED="1734661814900" TEXT="Operationen">
<icon BUILTIN="info"/>
<node COLOR="#435e98" CREATED="1734226624933" ID="ID_1270095402" MODIFIED="1734661802377" TEXT="buildFeed(TurnoutSystem&amp;) &#x2014; im Builder-Prototype"/>
<node COLOR="#435e98" CREATED="1734226650379" ID="ID_1952959461" MODIFIED="1734661802377" TEXT="connect() &#x2014; bef&#xfc;llt Aufruf-Struktur"/>
<node COLOR="#435e98" CREATED="1734226680799" ID="ID_435218687" MODIFIED="1734661802377" TEXT="invoke() &#x2014; f&#xfc;hrt ProcFun aus"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734276259404" ID="ID_814254927" MODIFIED="1734276322192" TEXT="Typ-Steuerung geht in die FeedManifold">
<linktarget COLOR="#3f4fb7" DESTINATION="ID_814254927" ENDARROW="Default" ENDINCLINATION="48;-164;" ID="Arrow_ID_584314736" SOURCE="ID_1748820043" STARTARROW="None" STARTINCLINATION="-244;14;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734282520970" ID="ID_1381423523" MODIFIED="1734282533060" TEXT="Aufgabe: flexible Storage-Struktur bereitstellen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1734282520970" ID="ID_1381423523" MODIFIED="1734661746730" TEXT="Aufgabe: flexible Storage-Struktur bereitstellen">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1734282535179" ID="ID_1723358537" MODIFIED="1734397871068" TEXT="l&#xe4;uft wohl hinaus auf ein compile-time conditional mix-in">
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1734282677568" ID="ID_1599850203" MODIFIED="1734397868364" TEXT="Konfigurations-Basis-Klasse dazwischen schalten">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1734661674044" ID="ID_1910773324" MODIFIED="1734661740845" TEXT="noch bessere Anordnung im Code">
<arrowlink COLOR="#708ea5" DESTINATION="ID_445121292" ENDARROW="Default" ENDINCLINATION="-35;127;" ID="Arrow_ID_1651811667" STARTARROW="None" STARTINCLINATION="135;10;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<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;"/>
@ -92459,6 +92452,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1734658155485" ID="ID_1572271675" MODIFIED="1734658185062" TEXT="canActivate(): zus&#xe4;tzlich ist dieser Funktor zur Laufzeit aktivier/deaktivierbar">
<icon BUILTIN="info"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734671074834" ID="ID_1566333649" MODIFIED="1734671133308" TEXT="spricht f&#xe4;lschlicherweise bei non-capture-&#x3bb; an">
<linktarget COLOR="#f60753" DESTINATION="ID_1566333649" ENDARROW="Default" ENDINCLINATION="-241;14;" ID="Arrow_ID_1437235705" SOURCE="ID_1457931587" STARTARROW="None" STARTINCLINATION="245;26;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1734671154295" ID="ID_1953698300" LINK="https://stackoverflow.com/a/41721337/444796" MODIFIED="1734671189335" TEXT="ist sogar standardkonform: &#xa7;5.1.2">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1734671197169" ID="ID_538913142" MODIFIED="1734671225598" TEXT="kann man den bool-Test noch retten?">
<icon BUILTIN="help"/>
<node CREATED="1734671228464" ID="ID_717933896" MODIFIED="1734671244693" TEXT="man k&#xf6;nnte explizit die Konversion in einen Funktionspointer ausschlie&#xdf;en"/>
<node CREATED="1734671254977" ID="ID_238590962" MODIFIED="1734671297200" TEXT="hilft explizite Konversion?"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734572439920" ID="ID_955026014" MODIFIED="1734642701637" TEXT="createFeed (TurnoutSystem&amp;) implementieren">
@ -92490,24 +92495,52 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</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 COLOR="#338800" CREATED="1734572530013" ID="ID_765842112" MODIFIED="1734674037652" TEXT="dynamische quer-Builder hinzuf&#xfc;gen">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734673756235" ID="ID_1413443497" MODIFIED="1734673778817" TEXT="hier gibt es leider wenig Spielraum">
<icon BUILTIN="smily_bad"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572553754" ID="ID_155507222" MODIFIED="1734572593980" TEXT="Konstruktor bereitstellen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#d6c281" COLOR="#4c142f" CREATED="1734673780995" ID="ID_1399950085" MODIFIED="1734673862947" TEXT="mu&#xdf; den Funktor verschieben (alles andere w&#xfc;rde zus&#xe4;tzliche Annahmen machen)">
<icon BUILTIN="messagebox_warning"/>
</node>
<node COLOR="#435e98" CREATED="1734673884116" ID="ID_1101157037" MODIFIED="1734673916920" TEXT="nun gut &#x2014; das hier ist ein low-level-API f&#xfc;r einen sehr anspruchsvollen Zweck">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1734673925368" ID="ID_1166262740" MODIFIED="1734674052257">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Name: <font face="Monospaced">prototype.</font><font face="Monospaced" color="#580c74">moveAdapted</font><font face="Monospaced">&#160;(paramFun)</font>
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#502980" DESTINATION="ID_1166262740" ENDARROW="Default" ENDINCLINATION="-41;65;" ID="Arrow_ID_1486300698" SOURCE="ID_801446694" STARTARROW="None" STARTINCLINATION="130;-4;"/>
<icon BUILTIN="idea"/>
<node CREATED="1734673959250" ID="ID_133707253" MODIFIED="1734673970621" TEXT="macht hoffentlich die Gefahr klar"/>
<node CREATED="1734674156760" ID="ID_1526243732" MODIFIED="1734674175194" TEXT="&#x27f9; param-Functor by-value"/>
</node>
</node>
<node COLOR="#338800" CREATED="1734572553754" ID="ID_155507222" MODIFIED="1734662088841" TEXT="Konstruktor bereitstellen">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node CREATED="1734645843309" ID="ID_860706642" MODIFIED="1734645923949" TEXT="im Test-Setup pr&#xfc;fen">
<linktarget COLOR="#418d52" DESTINATION="ID_860706642" ENDARROW="Default" ENDINCLINATION="-562;73;" ID="Arrow_ID_581949487" SOURCE="ID_1506431608" STARTARROW="None" STARTINCLINATION="-475;32;"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734645843309" ID="ID_860706642" MODIFIED="1734661636275" TEXT="im Test-Setup pr&#xfc;fen">
<linktarget COLOR="#5fa963" DESTINATION="ID_860706642" ENDARROW="Default" ENDINCLINATION="-580;71;" ID="Arrow_ID_581949487" SOURCE="ID_1506431608" STARTARROW="None" STARTINCLINATION="-475;32;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1734645927394" ID="ID_1561585107" LINK="#ID_332184252" MODIFIED="1734646140375" TEXT="NodeBase_test::verify_FeedPrototype()">
<linktarget COLOR="#3490d0" DESTINATION="ID_1561585107" ENDARROW="Default" ENDINCLINATION="-19;-46;" ID="Arrow_ID_1276202297" SOURCE="ID_1442022066" STARTARROW="None" STARTINCLINATION="-184;12;"/>
<icon BUILTIN="info"/>
</node>
<node CREATED="1734657891873" ID="ID_691202560" MODIFIED="1734657902719" TEXT="FeedPrototype erstellen">
<node COLOR="#338800" CREATED="1734657905943" ID="ID_1031794967" LINK="#ID_189910811" MODIFIED="1734658482968" TEXT="FeedManifold ohne Parameter-Funktor">
<node COLOR="#338800" CREATED="1734657891873" ID="ID_691202560" MODIFIED="1734674191310" TEXT="FeedPrototype erstellen">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#d8e0aa" COLOR="#0f6469" CREATED="1734657925045" ID="ID_189910811" MODIFIED="1734657972489" TEXT="wie &#xfc;blich ... ein paar kleine Bugs">
<node COLOR="#338800" CREATED="1734657925045" ID="ID_189910811" MODIFIED="1734670798593" STYLE="fork" TEXT="FeedManifold ohne Parameter-Funktor">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#d8e0aa" COLOR="#0f6469" CREATED="1734670743767" ID="ID_1750390897" MODIFIED="1734670765723" STYLE="fork" TEXT="wie &#xfc;blich ... ein paar kleine Bugs">
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
<icon BUILTIN="ksmiletris"/>
</node>
<node COLOR="#435e98" CREATED="1734658058658" ID="ID_1713601568" MODIFIED="1734658214396" TEXT="neues Status-Pr&#xe4;dikat: hasParamFun">
@ -92520,6 +92553,32 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#435e98" CREATED="1734658464595" ID="ID_1811872585" MODIFIED="1734658478814" TEXT="Parameter wird verwendet"/>
</node>
</node>
<node COLOR="#338800" CREATED="1734670653796" ID="ID_154709521" MODIFIED="1734673745378" TEXT="Prototype mit Parameter-Funktor">
<icon BUILTIN="button_ok"/>
<node COLOR="#312465" CREATED="1734670974963" ID="ID_801446694" MODIFIED="1734674085885" TEXT="verwende auch gleich einen cross-Konstruktor">
<arrowlink COLOR="#502980" DESTINATION="ID_1166262740" ENDARROW="Default" ENDINCLINATION="-41;65;" ID="Arrow_ID_1486300698" STARTARROW="None" STARTINCLINATION="130;-4;"/>
<icon BUILTIN="idea"/>
</node>
<node COLOR="#338800" CREATED="1734670998260" ID="ID_1422753156" MODIFIED="1734671024299" TEXT="funktioniert wie erwartet (und hatte einen Bug)">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734671025952" ID="ID_1165687930" MODIFIED="1734671035923" TEXT="Instanz-Verhalten zeigen">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734671037711" ID="ID_1457931587" MODIFIED="1734671133308" TEXT="canActivate() spricht an">
<arrowlink COLOR="#f60753" DESTINATION="ID_1566333649" ENDARROW="Default" ENDINCLINATION="-241;14;" ID="Arrow_ID_1437235705" STARTARROW="None" STARTINCLINATION="245;26;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node COLOR="#338800" CREATED="1734673651973" ID="ID_15461600" MODIFIED="1734673661619" TEXT="ansosten: works as designed">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1734674202627" ID="ID_1008931484" MODIFIED="1734674217583" TEXT="spiele mit mehreren Instanzen">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734674231175" ID="ID_308732589" MODIFIED="1734674238288" TEXT="std::function verwenden">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
@ -92844,6 +92903,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734496383891" ID="ID_352066932" MODIFIED="1734546010832" TEXT="damit wird das _ProcFun-Traits-Template wesentlich einfacher....">
<linktarget COLOR="#f8f2c0" DESTINATION="ID_352066932" ENDARROW="Default" ENDINCLINATION="1559;-1127;" ID="Arrow_ID_1251018017" SOURCE="ID_616834002" STARTARROW="None" STARTINCLINATION="641;26;"/>
<icon BUILTIN="idea"/>
<node COLOR="#338800" CREATED="1734537123396" ID="ID_1099344573" MODIFIED="1734537142599" TEXT="Fehlsteuerung in der Use-Case-Erkennung jetzt einfach zu beheben">
<icon BUILTIN="button_ok"/>
@ -92919,7 +92979,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="ksmiletris"/>
</node>
<node CREATED="1734645695088" ID="ID_1506431608" LINK="#ID_1048829589" MODIFIED="1734645923948" TEXT="Einbindung in FeedPrototype austesten">
<arrowlink COLOR="#418d52" DESTINATION="ID_860706642" ENDARROW="Default" ENDINCLINATION="-562;73;" ID="Arrow_ID_581949487" STARTARROW="None" STARTINCLINATION="-475;32;"/>
<arrowlink COLOR="#5fa963" DESTINATION="ID_860706642" ENDARROW="Default" ENDINCLINATION="-580;71;" ID="Arrow_ID_581949487" STARTARROW="None" STARTINCLINATION="-475;32;"/>
<icon BUILTIN="yes"/>
</node>
</node>
@ -99108,8 +99168,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711548381477" ID="ID_664146362" MODIFIED="1734654370564" TEXT="Buffer-Manager">
<linktarget COLOR="#fec499" DESTINATION="ID_664146362" ENDARROW="Default" ENDINCLINATION="-1409;197;" ID="Arrow_ID_616778881" SOURCE="ID_722733788" STARTARROW="None" STARTINCLINATION="-794;96;"/>
<linktarget COLOR="#5a4f77" DESTINATION="ID_664146362" ENDARROW="Default" ENDINCLINATION="-493;1406;" ID="Arrow_ID_297212964" SOURCE="ID_1433806835" STARTARROW="None" STARTINCLINATION="-1768;-2925;"/>
<linktarget COLOR="#fec499" DESTINATION="ID_664146362" ENDARROW="Default" ENDINCLINATION="-1409;197;" ID="Arrow_ID_616778881" SOURCE="ID_722733788" STARTARROW="None" STARTINCLINATION="-794;96;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1719249646221" ID="ID_403017464" MODIFIED="1719249923835" TEXT="Begriffe klarstellen">
<arrowlink COLOR="#4b5a6c" DESTINATION="ID_1263834914" ENDARROW="Default" ENDINCLINATION="-668;-90;" ID="Arrow_ID_767640863" STARTARROW="None" STARTINCLINATION="-873;115;"/>
@ -150185,7 +150245,7 @@ unsigned int ThreadIdAsInt = *static_cast&lt;unsigned int*&gt;(static_cast&lt;vo
sieht aber soweit sauber aus...
</p>
<p>
Wenngleich auch ziemlich elaboriert; all diese Tracking-Funktionalität war seinerzeit angelegt worden, aber nur oberflächlich getestet, weil der Render-Engine-Entwurf von 2012 letztlich steckengeblieben ist. Jetzt, 2024 beginne ich, den TrackingHeapBlockProvider zu für Tests zu nutzen, einfach weil er da ist — und stelle fest, daß einige Details unfertig und etwas unausgereift wirken....
Wenngleich auch ziemlich elaboriert; all diese Tracking-Funktionalit&#xe4;t war seinerzeit angelegt worden, aber nur oberfl&#xe4;chlich getestet, weil der Render-Engine-Entwurf von 2012 letztlich steckengeblieben ist. Jetzt, 2024 beginne ich, den TrackingHeapBlockProvider zu f&#xfc;r Tests zu nutzen, einfach weil er da ist &#x2014; und stelle fest, da&#xdf; einige Details unfertig und etwas unausgereift wirken....
</p>
</body>
</html></richcontent>