Invocation: introduce pattern data holder into NodeBuilder

- add an unspecified data holder type into the NodeBuilder
- establish ability to cross-build a `NodeBuilder` with adapted data holder
This commit is contained in:
Fischlurch 2024-10-21 03:40:19 +02:00
parent b4aee6fba8
commit 0de7905444
3 changed files with 98 additions and 69 deletions

View file

@ -128,10 +128,10 @@ namespace engine {
using DataBuilder = lib::SeveralBuilder<I,E, POL::template Policy>;
template<class POL>
template<class POL, class DAT>
class PortBuilderRoot;
template<class POL>
template<class POL, class DAT = PatternDataAnchor>
class NodeBuilder
: util::MoveOnly
{
@ -139,16 +139,25 @@ namespace engine {
using LeadRefs = DataBuilder<POL, ProcNodeRef>;
protected:
PortData ports_;
PortData ports_; ///////////////////////////////////////OOO obsolete and replaced by patternData_
LeadRefs leads_;
DAT patternData_;
public:
template<typename...INIT>
NodeBuilder (INIT&& ...alloInit)
: ports_{forward<INIT> (alloInit)...}
: ports_{forward<INIT> (alloInit)...} /////////////OOO obsolete and replaced by patternData_
, leads_{forward<INIT> (alloInit)...}
{ }
template<class BUILD, uint siz, class D0>
NodeBuilder (NodeBuilder<POL,D0>&& pred, BUILD&& entryBuilder)
: ports_{} /////////////OOO obsolete and replaced by patternData_
, leads_{move (pred.leads_)}
, patternData_{move (pred.patternData_), forward<BUILD> (entryBuilder)}
{ }
NodeBuilder
addLead (ProcNode const& lead)
@ -159,7 +168,7 @@ namespace engine {
/** recursively enter detailed setup of a single processing port */
PortBuilderRoot<POL> preparePort();
PortBuilderRoot<POL,DAT> preparePort();
/**
@ -200,12 +209,12 @@ namespace engine {
template<class POL>
template<class POL, class DAT>
class PortBuilderRoot
: protected NodeBuilder<POL>
: protected NodeBuilder<POL,DAT>
{
public:
NodeBuilder<POL>
NodeBuilder<POL,DAT>
completePort()
{
static_assert(not sizeof(POL),
@ -237,20 +246,20 @@ namespace engine {
* the enclosed original builder temporarily; the terminal builder operation
* PortBuilder::completePort() will unwrap and return the original NodeBuilder.
*/
template<class POL>
inline PortBuilderRoot<POL>
NodeBuilder<POL>::preparePort ()
template<class POL, class DAT>
inline PortBuilderRoot<POL, DAT>
NodeBuilder<POL,DAT>::preparePort ()
{
return PortBuilderRoot<POL>{move(*this)};
return PortBuilderRoot<POL,DAT>{move(*this)};
}
template<class POL, class WAB>
template<class POL, class DAT, class WAB>
class PortBuilder
: public PortBuilderRoot<POL>
: public PortBuilderRoot<POL,DAT>
{
using _Par = PortBuilderRoot<POL>;
using _Par = PortBuilderRoot<POL,DAT>;
WAB weavingBuilder_;
@ -310,13 +319,13 @@ namespace engine {
/*************************************************************//**
* Terminal: complete the Port wiring and return to the node level.
*/
NodeBuilder<POL>
NodeBuilder<POL,DAT> ////////////////////////////////////////OOO need to extend and evolve the DAT parameter here
completePort()
{
//////////////////////////////////////////////////////////OOO need to provide all links to lead nodes here
weavingBuilder_.fillRemainingBufferTypes();
_Par::ports_.append(weavingBuilder_.build());
return static_cast<NodeBuilder<POL>&&> (*this);
return static_cast<NodeBuilder<POL,DAT>&&> (*this);
} // slice away the subclass
private:
@ -326,17 +335,17 @@ namespace engine {
, weavingBuilder_{forward<FUN> (fun)}
{ }
friend class PortBuilderRoot<POL>;
friend class PortBuilderRoot<POL,DAT>;
};
template<class POL>
template<class POL, class DAT>
template<typename FUN>
auto
PortBuilderRoot<POL>::invoke (FUN&& fun)
PortBuilderRoot<POL,DAT>::invoke (FUN&& fun)
{
using WeavingBuilder_FUN = WeavingBuilder<POL, manifoldSiz<FUN>(), FUN>;
return PortBuilder<POL, WeavingBuilder_FUN>{move(*this), forward<FUN> (fun)};
return PortBuilder<POL,DAT, WeavingBuilder_FUN>{move(*this), forward<FUN> (fun)};
}
/*
template<class POL>

View file

@ -249,13 +249,19 @@ namespace engine {
PAR::collectEntries (dataBuilder, cntElm+1, max (siz,maxSiz));
buildEntry (dataBuilder);
}
PatternData(PAR&& predecessor, BUILD&& entryBuilder)
: PAR{move (predecessor)}
, buildEntry{move (entryBuilder)}
{ }
};
/**
* Data recursion end: prime the port data storage
* by reserving appropriate storage to hold all known Turnout elements.
*/
struct DimData
struct PatternDataAnchor
{
template<class DAB>
void
@ -265,6 +271,7 @@ namespace engine {
}
};
template<uint N, class FUN>
using SimpleDirectInvoke = SimpleWeavingPattern<Conf_DirectFunctionInvocation<N,FUN>>;

View file

@ -8767,9 +8767,7 @@
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1511455484027" ID="ID_548359395" MODIFIED="1511572072779" TEXT="unmittelbare Folge davon, da&#xdf; wir den Typ des Expand-Funktors analysieren">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
_fun&lt;FUN&gt;::Sig scheitert
@ -9158,9 +9156,7 @@
<node CREATED="1512250807318" FOLDED="true" ID="ID_1268505006" MODIFIED="1512926191761" TEXT="das w&#xe4;ren zwei Indirektionen pro Layer....">
<node CREATED="1512250866126" ID="ID_739491519" MODIFIED="1512250917460" TEXT="zwar optimierbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wir gehen davon aus,
@ -9946,9 +9942,7 @@
</node>
<node CREATED="1512769179503" ID="ID_1053011981" MODIFIED="1512769198300">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>jeder</i>&#160;Zugriff auf ein Sub-Objekt mu&#223; durch eine VTable
@ -11291,9 +11285,7 @@
</node>
<node CREATED="1513891876365" ID="ID_39114883" MODIFIED="1513891928397" TEXT="Knackpunkt: Struktur mu&#xdf; schon da sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das hei&#223;t:
@ -12614,9 +12606,7 @@
</node>
<node CREATED="1522809051096" ID="ID_1045087817" MODIFIED="1522809066884">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
ViewLocator <i>ruft</i>&#160;die DSL auf
@ -14938,9 +14928,7 @@
<node CREATED="1525565935350" ID="ID_252570354" MODIFIED="1525565950136" TEXT="Instanz-Limit"/>
<node CREATED="1525565950988" ID="ID_1233385790" MODIFIED="1525567162939">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
kann dazu f&#252;hren,
@ -17893,9 +17881,7 @@
</node>
<node CREATED="1541088480846" ID="ID_6642470" MODIFIED="1576282358101" TEXT="Kopf proportional platzierbar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Vorgabe ist ein Fenster(=Intervall) und dessen Position relativ zum Widget-Start.
@ -22797,9 +22783,7 @@
<icon BUILTIN="idea"/>
<node CREATED="1563019440558" ID="ID_1321598849" MODIFIED="1576282358088" TEXT="Scope-Insets">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
die Vertiefungen im Anzeige-Profil
@ -49447,9 +49431,7 @@
<font NAME="SansSerif" SIZE="14"/>
<node CREATED="1582388650742" ID="ID_681444782" MODIFIED="1582388698969">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
&#187;<b>Tangible</b>&#171; : Basis
@ -50053,9 +50035,7 @@
<node CREATED="1481413462638" ID="ID_485427993" MODIFIED="1518487921090" TEXT="Problem: Backlink zum Nexus"/>
<node CREATED="1481413470268" ID="ID_688303898" MODIFIED="1576282358006" TEXT="Nexus ist zu dem Zeitpunkt schon destruiert">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Die L&#246;sung f&#252;r diese wecheslseitige Abh&#228;ngigkeit
@ -50566,9 +50546,7 @@
<node CREATED="1455290807459" ID="ID_1222290895" MODIFIED="1518487921091" TEXT="mu&#xdf; Ausz&#xfc;ge aus dieser Info schaffen"/>
<node CREATED="1455290827193" ID="ID_1429808095" MODIFIED="1518487921091">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
nach <b>Perspektive</b>
@ -50811,9 +50789,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1488676827432" ID="ID_1354771185" MODIFIED="1576282357999" TEXT="Problem: air-Gap">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wegen
@ -50930,9 +50906,7 @@
</node>
<node CREATED="1488936942317" ID="ID_222608258" MODIFIED="1488939548823">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Proc: <b>CmdInstanceManager</b>
@ -89750,7 +89724,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1728919724334" ID="ID_1429006329" MODIFIED="1728919748503" TEXT="Bleibt aber das Problem mit realloc()">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728919724334" ID="ID_1429006329" MODIFIED="1729477431404" TEXT="Bleibt aber das Problem mit realloc()">
<arrowlink COLOR="#eb3d5e" DESTINATION="ID_1149896689" ENDARROW="Default" ENDINCLINATION="-34;-33;" ID="Arrow_ID_1718389433" STARTARROW="None" STARTINCLINATION="-192;14;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1728919780226" ID="ID_459933288" MODIFIED="1728920202861" TEXT="die &#xbb;Hintert&#xfc;r&#xab; funktioniert nur f&#xfc;r die aktuell neueste Allokation">
@ -89766,8 +89740,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1728920206175" ID="ID_1988845099" MODIFIED="1728920273724" TEXT="aber der nested-Builder bewirkt verschachtelte Allokations-Anforderungen"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728920314192" ID="ID_147357026" MODIFIED="1728920324731" TEXT="L&#xf6;sungen">
<icon BUILTIN="idea"/>
<node CREATED="1728920326985" ID="ID_548153639" MODIFIED="1728920342770" TEXT="ben&#xf6;tigte Anzahl zu Beginn verbindlich festsetzen"/>
<node CREATED="1728920344206" ID="ID_337652041" MODIFIED="1728920686754" TEXT="trickreichen Aufruf, der alle Builder in einem Lauf abfeuert">
<node COLOR="#5b280f" CREATED="1728920326985" ID="ID_548153639" MODIFIED="1729477474451" TEXT="ben&#xf6;tigte Anzahl zu Beginn vom Client verbindlich festzusetzen">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1728920344206" ID="ID_337652041" MODIFIED="1729477477113" TEXT="trickreichen Aufruf, der alle Builder in einem Lauf abfeuert">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -89781,6 +89757,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</ul>
</body>
</html></richcontent>
<icon BUILTIN="forward"/>
</node>
</node>
</node>
@ -90037,8 +90014,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1729307392664" ID="ID_1001735525" MODIFIED="1729307415447" TEXT="Several&lt;BuffDescr&gt;"/>
<node CREATED="1729307446488" ID="ID_457436977" MODIFIED="1729307460312" TEXT="N (Gr&#xf6;&#xdf;e der Manifold)"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1729307494039" ID="ID_1819511988" MODIFIED="1729307810896" TEXT="Idee: Tail-rekursiver Builder-Aufruf?">
<node COLOR="#5b280f" CREATED="1729307494039" ID="ID_1819511988" MODIFIED="1729477545927" TEXT="Idee: Tail-rekursiver Builder-Aufruf?">
<icon BUILTIN="help"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1729307525576" ID="ID_1617175155" MODIFIED="1729307576310" TEXT="man w&#xfc;rde damit die Dateninhalte auf dem Stack sammeln"/>
<node CREATED="1729307669041" ID="ID_1469484154" MODIFIED="1729307806096" TEXT="allerdings mu&#xdf; dann auch die Port-Erzeugung Tail-rekursiv geschrieben werden">
<richcontent TYPE="NOTE"><html>
@ -90050,8 +90028,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node COLOR="#5b280f" CREATED="1729477530286" ID="ID_788048421" MODIFIED="1729477542975" TEXT="keine gute Idee">
<icon BUILTIN="stop-sign"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1729307854949" ID="ID_556427565" MODIFIED="1729307889585" TEXT="Alternative: Dateninhalte auf dem Stack sammeln?">
</node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#990033" CREATED="1729307854949" ID="ID_556427565" MODIFIED="1729477618465" TEXT="Alternative: Dateninhalte auf dem Stack sammeln?">
<icon BUILTIN="help"/>
<node CREATED="1729307896503" ID="ID_195478436" MODIFIED="1729307957714" TEXT="ein Tupel (Several&lt;PortRef&gt;,Several&lt;BuffDescr&gt;, std::function, N)"/>
<node CREATED="1729307966587" ID="ID_1262034001" MODIFIED="1729308011601" TEXT="man kann dann in einem Pass das max(N) finden und damit dimensionieren"/>
@ -90069,6 +90050,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#5b280f" CREATED="1729434345618" ID="ID_31768721" MODIFIED="1729434364792" TEXT="damit wird diese L&#xf6;sung ih&#xe4;rent redundant">
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1729477560424" ID="ID_1164894748" MODIFIED="1729477610889" TEXT="das f&#xfc;hrt zu einer Variante...">
<arrowlink COLOR="#56638e" DESTINATION="ID_1796646662" ENDARROW="Default" ENDINCLINATION="138;-8;" ID="Arrow_ID_8244527" STARTARROW="None" STARTINCLINATION="246;23;"/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729308176710" ID="ID_70235871" MODIFIED="1729308532647" TEXT="Wichtig: am Ende des PortBuilder&apos; bereits eine Type-Erasure machen">
<richcontent TYPE="NOTE"><html>
@ -90108,8 +90093,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729385699535" ID="ID_1823720040" MODIFIED="1729385709180" TEXT="Umstellung der Implementierung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729385821879" ID="ID_562398626" MODIFIED="1729385850635" TEXT="neues Interface f&#xfc;r Build-Ergebnis schaffen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729385821879" ID="ID_562398626" MODIFIED="1729477924907" TEXT="neues Interface f&#xfc;r Build-Ergebnis schaffen">
<icon BUILTIN="yes"/>
<node CREATED="1729385860586" ID="ID_1726006228" MODIFIED="1729385872581" TEXT="Zweck...">
<node CREATED="1729385873337" ID="ID_1712688191" MODIFIED="1729385886298" TEXT="erzeuge eine Deque mit function-Objekten"/>
<node CREATED="1729385887568" ID="ID_44692572" MODIFIED="1729385917344" TEXT="diese nehmen eine DataBuilder-Referenz als Argument"/>
@ -90130,11 +90115,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1729386535588" ID="ID_288497913" MODIFIED="1729386568518" TEXT="ist lediglich eine Typedef + ein Consumer-Functor"/>
</node>
<node CREATED="1729386797044" ID="ID_1761275309" MODIFIED="1729386814097" TEXT="Builder-Closure vom WeavingBuilder entkoppeln">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729386797044" ID="ID_1761275309" MODIFIED="1729477910915" TEXT="Builder-Closure vom WeavingBuilder entkoppeln">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729386815675" ID="ID_1416710632" MODIFIED="1729386828903" TEXT="WeavingBuilder lebt nur tempor&#xe4;r auf dem Stack">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729434130348" ID="ID_1796646662" MODIFIED="1729434165322" TEXT="mu&#xdf; size-Info weitergeben &#x27f9; Funktor allein gen&#xfc;gt nicht">
<linktarget COLOR="#56638e" DESTINATION="ID_1796646662" ENDARROW="Default" ENDINCLINATION="138;-8;" ID="Arrow_ID_8244527" SOURCE="ID_1164894748" STARTARROW="None" STARTINCLINATION="246;23;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1729435375920" ID="ID_232356982" MODIFIED="1729435650306" TEXT="damit bleibt nur eine rekursive funktionale Datenstruktur &#xfc;brig">
<richcontent TYPE="NOTE"><html>
@ -90261,6 +90248,32 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729476213539" ID="ID_1086673999" MODIFIED="1729477907340" TEXT="Weitergabe der Pattern-Daten">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729476230116" ID="ID_632213709" MODIFIED="1729477873527" TEXT="sie m&#xfc;ssen im NodeBuilder liegen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1729477632752" ID="ID_1978776650" MODIFIED="1729477655829" TEXT="mu&#xdf; dazu einen zweiten Typpatameter DAT &#xfc;berall durchschleifen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1729477657086" ID="ID_1689496793" MODIFIED="1729477812614" TEXT="brauche einen copy-and-adapt-Konstruktur">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...damit die terminale Methode des PortBuilders nun nicht mehr den originalen NodeBuilder per slice-copy extrahiert, sondern stattdessen eine angepa&#223;te Variante erzeugen kann, bei der ein &#187;Zwiebelschalen-Layer&#171; um die PatternData gelegt wird, w&#228;hrend alle weiteren Daten per move weitergeschoben werden
</p>
</body>
</html>
</richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729477829436" ID="ID_669795504" MODIFIED="1729477870839" TEXT="PortBuilder::build() mu&#xdf; nun Build-Funktor erzeugen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729477875734" ID="ID_1268344411" MODIFIED="1729477903179" TEXT="Datenerzeugung &#xfc;ber die Funktoren-Kette">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
</node>