Invocation: implementation for the chain-constructor

This was a tough nut to crack, but recalling the actual usage situation was helpful
 * the ''constructor type'' must be created / picked-up beforehand
 * we are about to build a ''parameter-computation node''
 * so this constructor presumably is passed to a type parameter of a specific weaving pattern
 * the constructor must be invoked directly to drop-off the new data frame into the local scope
 * it is preferable to attach it only in a second step to the existing HeteroData-Chain (residing in `TurnoutSystem`)

What would be ''desirable'' though is to have some additional safeguard in the type system
to prevent attaching the newly constructed block to a chain with a non-fitting layout,
i.e. the case when several constructors or types get mixed up (because without any further
safe-guard this would lead to uncoordinated out-of-bounds memory access)
This commit is contained in:
Fischlurch 2024-12-10 18:49:06 +01:00
parent 54dc8cc032
commit 56bf5ecc8e
4 changed files with 357 additions and 53 deletions

View file

@ -47,6 +47,8 @@
#include "lib/nocopy.hpp"
//#include "lib/linked-elements.hpp"
#include "lib/meta/typelist.hpp"
#include "lib/meta/typelist-manip.hpp"
#include "lib/meta/typeseq-util.hpp"
//#include <algorithm>
//#include <vector>
@ -134,7 +136,27 @@ namespace lib {
};
template<typename...VALS>
using Constructor = typename _Tail::template Constructor<VALS...>;
struct Constructor
{
using NewFrame = StorageFrame<VALS...>;
using ChainType = meta::Append<meta::Node<Frame,TAIL>,NewFrame>;
template<typename...INIT>
NewFrame
operator() (INIT&& ...initArgs)
{
return {initArgs ...};
}
template<typename...XVALS>
using ChainConstructor = typename ChainType::template Constructor<XVALS...>;
template<size_t slot>
using Accessor = typename ChainType::template Accessor<_Self::size()+slot>;
template<typename X>
using AccessorFor = Accessor<meta::indexOfType<X,VALS...>()>;
};
};
template<>

View file

@ -56,6 +56,29 @@ namespace lib {
namespace meta {
/**
* Find the index of the first incidence of a type in a type-sequence.
* @note static assertion if the type is not in the type sequence
* @see https://stackoverflow.com/a/60868425/444796
*/
template<class X>
constexpr size_t
indexOfType()
{
static_assert (not sizeof(X), "Type not found in type-sequence");
return 0;
}
template<class X, class T, class... TYPES>
constexpr size_t
indexOfType()
{
if constexpr (std::is_same_v<X,T>)
return 0;
else
return 1 + indexOfType<X,TYPES...>();
}
/**
* Helper: prepend a type to an existing type sequence,

View file

@ -32,10 +32,9 @@
#include "lib/meta/typeseq-util.hpp"
#include "lib/meta/typelist-manip.hpp"
#include "meta/typelist-diagnostics.hpp"
#include "lib/format-cout.hpp"
using std::string;
using std::cout;
using std::endl;
namespace lib {
@ -45,8 +44,6 @@ namespace test {
namespace { // test data
typedef Types< Num<1>
, Num<2>
, Num<3>
@ -56,7 +53,6 @@ namespace test {
, Num<9>
> Types2;
// see also the CountDown template in typelist-diagnostics.hpp...
} // (End) test data
@ -78,6 +74,7 @@ namespace test {
virtual void
run (Arg)
{
check_indexOf ();
check_buildSeq();
check_prepend ();
check_shift ();
@ -85,6 +82,17 @@ namespace test {
}
void
check_indexOf()
{
CHECK ((0 == indexOfType<int, int, string, string>()));
CHECK ((1 == indexOfType<string, int, string, string>()));
CHECK ((2 == indexOfType<int, string, string, int>()));
// indexOfType<int>();
// indexOfType<int,long,long>(); // does not compile...
}
void
check_buildSeq ()
{

View file

@ -21640,9 +21640,7 @@
</node>
<node COLOR="#435e98" CREATED="1612002421081" ID="ID_704646941" MODIFIED="1666477585185">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
aber dieses Design ist <i>schief</i>
@ -22344,9 +22342,7 @@
<node CREATED="1480120349873" ID="ID_795629510" MODIFIED="1557498707225" TEXT="Diff repr&#xe4;sentiert &#xc4;nderungen indirekt"/>
<node CREATED="1480120487509" ID="ID_1693545323" MODIFIED="1557498707225">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
speziell die Umordnungen <i>ergeben sich</i>
@ -22797,9 +22793,7 @@
<icon BUILTIN="full-1"/>
<node CREATED="1480776096665" ID="ID_1492275941" MODIFIED="1576282358080" TEXT="das hei&#xdf;t....">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Thema &quot;Darstellung von Objekt-Feldern im Diff&quot;
@ -23274,9 +23268,7 @@
</node>
<node CREATED="1666481516664" ID="ID_452196146" MODIFIED="1666483676987" TEXT="CanvasHook mix-in?">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
CanvasHook k&#246;nnte ein konkretes mix-In sein; d.h. zumindest die DisplayMetric w&#228;re zwar als weitere mix-in-Komponente in einem anderen Header definiert (um den Code klar zu halten), aber letztlich bereits auf Interface-Ebene komplett in der Implementierung sichtbar. Die zwei Faktoren der affin-linearen-Transformation w&#228;ren mutable Variable, die per Setter ge&#228;ndert werden k&#246;nnen...
@ -24417,9 +24409,7 @@
<node CREATED="1583103686706" ID="ID_1021464384" MODIFIED="1583103698796" TEXT="wir n&#xe4;hern uns dem korrekten Layout inkrementell an"/>
<node CREATED="1583103711798" ID="ID_1460889946" MODIFIED="1583104046449" TEXT="daher ist die Reihenfolge des Besuchs fast egal">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<u>Warum</u>? Weil wir immer die Hilfe von GTK brauchen, um aus unseren ver&#228;nderten Vorgaben eine Platz-Allokation zu machen. Und diese Hilfe k&#246;nnen wir nicht synchron anfordern, sondern triggern sie indirekt durch setzen neuer Mindestgr&#246;&#223;en...
@ -26507,9 +26497,7 @@
<icon BUILTIN="help"/>
<node COLOR="#990000" CREATED="1576974036176" ID="ID_1084997647" MODIFIED="1611478475301" TEXT="wenn ja: dann h&#xe4;tten wir ein Problem mit remove()">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
weil dieses n&#228;mlich keine Koordinaten bekommt, und daher nicht wei&#223;, in welchem Canvas das zu entfernde Widget steckt
@ -29943,9 +29931,7 @@
</node>
<node COLOR="#435e98" CREATED="1678916699994" ID="ID_868064127" MODIFIED="1678916785049" TEXT="(derzeit bleibt die Timeline auf dem Default von 23sec)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...es kommt halt nix Spezifisches aus dem Model, aber es g&#228;be auch bisher gar keine entsprechenden Diff-Bindings und Model-Properties im GUI
@ -32648,9 +32634,7 @@
</node>
<node CREATED="1563831978878" ID="ID_1798339852" MODIFIED="1563832006629" TEXT="buttons: verwenden box-shadow">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
&#160;&#160;box-shadow: inset 0px 0px 0px 1px shade (@theme_bg_color, 1.15), 0px 1px 2px rgba(0, 0, 0, 0.1); }
@ -36887,9 +36871,7 @@
<linktarget COLOR="#a9b4c1" DESTINATION="ID_277761751" ENDARROW="Default" ENDINCLINATION="-48;213;" ID="Arrow_ID_1127398125" SOURCE="ID_748660217" STARTARROW="None" STARTINCLINATION="256;0;"/>
<node CREATED="1533311322220" ID="ID_1614182663" MODIFIED="1576282358026" TEXT="Fenster-aktivieren passiert vor der Loop">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das ist f&#252;r mich eine neue Einsicht.
@ -38970,9 +38952,7 @@
<node CREATED="1619903180827" ID="ID_250477630" MODIFIED="1619903245581" TEXT="dar&#xfc;ber mu&#xdf; ich wohl (zun&#xe4;chst?) gro&#xdf;z&#xfc;gig hinwegsehen"/>
<node CREATED="1619903259743" ID="ID_872225515" MODIFIED="1619903353944" TEXT="zu Vieles ist noch nicht klar">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -39642,9 +39622,7 @@
<node CREATED="1661696249705" ID="ID_504989161" MODIFIED="1661696270808" TEXT="wird ausgel&#xf6;st &#xfc;ber lokales Widget-Binding"/>
<node CREATED="1661696271684" ID="ID_1004582513" MODIFIED="1661696338493" TEXT="k&#xf6;nnte auch durch ein generisches Fallback-Binding ausgel&#xf6;st werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
ich meine rechts-Klick; typischerweise implementiert man den Handler daf&#252;r auf einem Canvas; aber dann ist das Problem: wie findet der Handler das konkrete Widget, und von diesem den Kontext f&#252;r das pop-Up?
@ -40287,9 +40265,7 @@
</node>
<node CREATED="1666966240650" ID="ID_248937535" MODIFIED="1666966303328" TEXT="es g&#xe4;be mehrfach-Benachrichtigung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn aufgrund der ersten (ggfs sogar <b>falschen</b>&#160;Benachrichtigung) w&#252;rde das ZoomWindow selber die Parameter glattziehen, was erneute Benachrichtigung zur Folge h&#228;tte
@ -40614,9 +40590,7 @@
</node>
<node CREATED="1667604025125" ID="ID_573471794" MODIFIED="1667604225117" TEXT="die Korrektur-Regeln zum Einhalten der Constraints sind komplex (im Allgemeinen)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar, wenn man <i>wirklich alle</i>&#160;Eingangswerte zul&#228;&#223;t, und sich eben nicht nur auf <i>vern&#252;nftige </i>Eingaben <i>verl&#228;&#223;t.</i>
@ -40796,9 +40770,7 @@
<node CREATED="1667682713949" ID="ID_425310807" MODIFIED="1667682719231" TEXT="Grenzfall-Analyse">
<node CREATED="1667682721338" ID="ID_842333816" MODIFIED="1667682794317" TEXT="Fenster kann verk&#xfc;rzt werden durch Rundung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
<font face="Monospaced">afterWin_ = startWin_ + Time{dur};</font>
@ -87854,6 +87826,50 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1733804529591" ID="ID_811390325" MODIFIED="1733804573211" TEXT="Accessor als nested Template &#x27f9; enth&#xe4;lt implizit den Typ der gesamten Chain">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1733851448124" ID="ID_1526678744" MODIFIED="1733851477943" TEXT="Vorsicht Falle: die Slot-Nr wird hier relativ zum neuen Tupel ben&#xf6;tigt">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1733851479790" ID="ID_1737189268" MODIFIED="1733851545929" TEXT="anders w&#xe4;re es nicht sinnvoll...">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...obzwar m&#246;glich, kann man nicht sinnvollerweise vom Benutzer verlangen, da&#223; der den Basis-Offset kennt &#8212; und obendrein w&#228;re eine solche Angabe dann auch noch verwirrend im Code
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#338800" CREATED="1733851547437" ID="ID_1704921041" MODIFIED="1733851566531" TEXT="man k&#xf6;nnte Variante bieten, den den Index per Typ findet">
<icon BUILTIN="button_ok"/>
<node CREATED="1733851568306" ID="ID_1935766805" LINK="https://stackoverflow.com/q/18063451/444796" MODIFIED="1733851613554" TEXT="Stackoverflow">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1733851615663" ID="ID_1818259716" MODIFIED="1733851631501" TEXT="die L&#xf6;sung mit Fold-Expression ist unglaublich elegant"/>
<node CREATED="1733851632353" ID="ID_1457635602" MODIFIED="1733851786299" TEXT="leider schaffe ich es nicht, damit eine static_assertion zu produzieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...das ist hier im use-case ein wichtiges Sicherheits-Feature ... und auch generell halte ich eine solche get-index-Funktion f&#252;r gef&#228;hrlich, wenn sie im Fehlerfall -1 zur&#252;ckgibt.
</p>
<p>
Konkret ist das Problem, da&#223; die Fold-Expression von meinem Compiler nicht als constexpr akzeptiert wird (weil man ja &#252;ber die Fold-Expression einen Index inkrementiert). M&#246;glicherweise w&#252;rde das dann mit C++20 gehen?
</p>
</body>
</html>
</richcontent>
</node>
<node COLOR="#435e98" CREATED="1733851787845" ID="ID_412406851" MODIFIED="1733851807217" TEXT="dann doch lieber eine einfache rekursive L&#xf6;sung mit constexpr-if">
<icon BUILTIN="yes"/>
</node>
<node COLOR="#338800" CREATED="1733851810066" ID="ID_93427598" MODIFIED="1733851823625" TEXT="in typeseq-util.hpp abgelegt (und getestet!)">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1733851835255" ID="ID_1021269190" MODIFIED="1733852014748" TEXT="Accessoren auch &#xfc;ber den Konstruktor abgreifbar">
<linktarget COLOR="#01ba2e" DESTINATION="ID_1021269190" ENDARROW="Default" ENDINCLINATION="-582;31;" ID="Arrow_ID_1159712630" SOURCE="ID_13086801" STARTARROW="None" STARTINCLINATION="-91;0;"/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1733804575033" ID="ID_374529337" MODIFIED="1733804581760" TEXT="Konstruktur">
<icon BUILTIN="pencil"/>
@ -87872,8 +87888,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
bei Aufruf wird dann der eigentliche Storage-Frame <i>erzeugt <b>und</b>&#160; registriert</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1733804769854" ID="ID_148296974" MODIFIED="1733804802554" TEXT="Problem: diese Registrierung ist kniffelig">
<icon BUILTIN="messagebox_warning"/>
@ -87905,10 +87920,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
und <i>diese</i>&#160;mu&#223; nun in einen Vorg&#228;nger-Frame geschrieben werden
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1733804917746" ID="ID_1185565269" MODIFIED="1733804932336" TEXT="??? Woot ???">
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1733804917746" ID="ID_1185565269" MODIFIED="1733835639063" TEXT="??? wie schaffe ich das nur ???">
<arrowlink COLOR="#fffde1" DESTINATION="ID_1456102629" ENDARROW="Default" ENDINCLINATION="-241;13;" ID="Arrow_ID_1934239160" STARTARROW="None" STARTINCLINATION="-98;366;"/>
<icon BUILTIN="smily_bad"/>
<node CREATED="1733804944471" ID="ID_1490645699" MODIFIED="1733804971335" TEXT="Idee-1 : Storage-Frame bekommt zus&#xe4;tzlichen pointer-Parameter"/>
<node CREATED="1733804972427" ID="ID_1289574080" MODIFIED="1733804987877" TEXT="Idee-2 : etwas mit Lambdas zaubern....?">
@ -87918,6 +87933,242 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1733834483620" ID="ID_585239021" MODIFIED="1733834519382" TEXT="Situation des Nutzens vergegenw&#xe4;rtigen">
<icon BUILTIN="forward"/>
<node CREATED="1733834527058" ID="ID_1496514894" MODIFIED="1733834543856" TEXT="aufgerufen wird eine spezielle ParamNode">
<node CREATED="1733834545401" ID="ID_47691367" MODIFIED="1733834566914" TEXT="effektiv ist das dann ein Port mit speziellem WeavingPattern"/>
<node CREATED="1733834568965" ID="ID_830457595" MODIFIED="1733834586483" TEXT="das hat eine Funktion weave(TurnoutSystem&amp;)"/>
<node CREATED="1733834590910" ID="ID_531459925" MODIFIED="1733834610065" TEXT="dieses WeavingPattern ist strukturell ein Dekorator"/>
<node CREATED="1733834611322" ID="ID_295306469" MODIFIED="1733834633733" TEXT="es &#xbb;dekoriert&#xab; eine andere Node und delegiert an einen Port"/>
<node CREATED="1733834637540" ID="ID_1992504300" MODIFIED="1733834659282" TEXT="nur macht es eben vorher eine Parameter-Berechnung"/>
<node CREATED="1733834660709" ID="ID_544654844" MODIFIED="1733834681765" TEXT="und dann forwarded es den Aufruf und gibt das Ergebnis nach oben zur&#xfc;ck"/>
</node>
<node CREATED="1733834687569" ID="ID_363279018" MODIFIED="1733834714657" TEXT="der Funktor f&#xfc;r die Parameter liegt als Feld in diesem Param-WeavingPattern">
<node CREATED="1733834718581" ID="ID_1417046806" MODIFIED="1733834736286" TEXT="er nimmt als Argument einen (oder mehrere) Basis-Parameterwerte"/>
<node CREATED="1733834737227" ID="ID_38945547" MODIFIED="1733834877475" TEXT="diese bekommt man &#xfc;ber einen Accessor auf dem TurnoutSystem">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
so ein Accessor kann fest auf dem TurnoutSystem eingebaut sein, also getNominalTime(), oder er ist anderweitig kontextuell gegeben und damit ein frei stehendes Accessor-Objekt, das in der Vorbereitungs-Phase von einem HeteroData-Chain generiert wurde
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1733834883409" ID="ID_909364391" MODIFIED="1733834992623" TEXT="mit diesen steigt man in die eigentlichen Parameter-Berechnungsfunktion ein">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...diese ist ein Funktor, der von <i>gans woanders</i>&#160;stammt &#8212; n&#228;mlich von dem Builder aus dem High-Level-Model gewrappt, z.B. Auswertung einer B&#233;zier-Kurve
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1733835046313" ID="ID_1292820259" MODIFIED="1733835132658" TEXT="die so erzeugten Parameter gehen in den Tupel-Konstruktor"/>
<node CREATED="1733835133813" ID="ID_838878251" MODIFIED="1733835167301" TEXT="und das Resultat ist ein Datenobjekt">
<node CREATED="1733835168709" ID="ID_300509356" MODIFIED="1733835187010" TEXT="...das man entweder direkt im aktuellen lokalen Scope liegen l&#xe4;&#xdf;t und nutzt"/>
<node CREATED="1733835187921" ID="ID_1979458961" MODIFIED="1733835248926" TEXT="...oder irgendwo initialisiert">
<node CREATED="1733835256245" HGAP="26" ID="ID_858129101" MODIFIED="1733835303357" TEXT="also sollte der Typ des Datenobjekts im Konstruktor-Funktor abgreifbar sein" VSHIFT="5"/>
</node>
</node>
<node CREATED="1733835312855" ID="ID_474186463" MODIFIED="1733835350413" TEXT="und schlie&#xdf;lich mu&#xdf; dieses Datenobjekt noch an die HeteroData-chain angeh&#xe4;ngt werden"/>
<node CREATED="1733835380949" ID="ID_717968240" MODIFIED="1733835397291" TEXT="&#xdc;berraschung: es ist besser, dies vom Konstruktor zu trennen">
<node CREATED="1733835597896" ID="ID_894747952" MODIFIED="1733835763039" TEXT="denn nur so kann man diese Struktur dem Leser einigerma&#xdf;en verst&#xe4;ndlich machen" VSHIFT="7"/>
<node BACKGROUND_COLOR="#d6d3b7" CREATED="1733835399954" ID="ID_1456102629" MODIFIED="1733835639063" TEXT="gut wenn man eine Nacht &#xfc;ber Probleme schl&#xe4;ft">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
gestern habe ich mich furchbar geplagt, weil ich fest davon &#252;berzeugt war, da&#223; dieses Anh&#228;ngen im Konstruktor untergebracht werden mu&#223;
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#fffde1" DESTINATION="ID_1456102629" ENDARROW="Default" ENDINCLINATION="-241;13;" ID="Arrow_ID_1934239160" SOURCE="ID_1185565269" STARTARROW="None" STARTINCLINATION="-98;366;"/>
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#e1e1ad" CREATED="1733835693643" ID="ID_1560247506" MODIFIED="1733835752001" TEXT="es gibt aber noch Freiheitsgrade der Formulierung">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1733835765911" ID="ID_1865837396" MODIFIED="1733835806641">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
das Ankn&#252;pfen k&#246;nnte man <i>r&#252;ckw&#228;rts gehend</i>&#160;einleiten
</p>
</body>
</html></richcontent>
<node CREATED="1733835810003" ID="ID_322730027" MODIFIED="1733835932550" TEXT="also als Funktion auf dem erzeugten Datenblock: linkInto(TurnoutSystem&amp;)"/>
<node CREATED="1733835981732" ID="ID_483075213" MODIFIED="1733836127364" TEXT="Grund: ich suche nach einer M&#xf6;glichkeit zur compile-time-Absicherung der Struktur">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
denn Runtime-Checks sind ausgeschlossen, da wir es uns nicht leisten k&#246;nnen, die entsprechenden Metadaten (VTable oder Funktor) in jeder einzelnen Node-Invocation wieder zu speichern; die Info kann aber auch nicht im Aufruf-Typ untergebracht werden, denn dieser ist generisch und f&#252;r alle Nodes gleich
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1733836189832" ID="ID_608912126" MODIFIED="1733836267145" TEXT="gew&#xfc;nscht w&#xe4;re, da&#xdf; der sp&#xe4;ter verwendete Accessor an dieser Stelle garantiert pa&#xdf;t"/>
<node CREATED="1733836283366" ID="ID_1204057143" MODIFIED="1733836294577" TEXT="das ist nun aber schwierig, und auch fragw&#xfc;rdig">
<node CREATED="1733836304033" ID="ID_1769104177" MODIFIED="1733836358940" TEXT="das Bindeglied ist ja der Konstruktor-Funktor">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
denn dieser erstellt einerseits den lokalen Daten-Record, andererseits greift man von diesem auch die Accessoren ab
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1733836360473" ID="ID_985630587" MODIFIED="1733836394993" TEXT="zu pr&#xfc;fen w&#xe4;re also, ob der Datenrecord tats&#xe4;chlich seinem Typ gem&#xe4;&#xdf; angeh&#xe4;ngt wird"/>
<node CREATED="1733836403236" ID="ID_97000599" MODIFIED="1733836479233" TEXT="die zum Anh&#xe4;ngen notwendige Zugangs-Funktion mu&#xdf; aber ohnehin einen force-Cast machen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
eben weil wir im HeteroData-Chain selber (also dem TurnoutSystem) keine Metadaten unterbringen wollen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1733836480541" ID="ID_1669530928" MODIFIED="1733836721760" TEXT="m&#xf6;glich und aber auch genau hinreichend w&#xe4;re jedoch ein Plausibilit&#xe4;ts-Check">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...dieser Check w&#252;rde pr&#252;fen, ob wir nach einer vorkonfigurierten Anzahl an Schritten exakt hinter dem Ende des aktuellen Chain stehen &#8212; denn <i>genau dann</i>&#160;kann ein damit konform konstruierter Accessor keinen Schaden mehr anrichten: der lokale Tupel-Typ steckt ja im Kontext des Konstruktors, und wurde deshalb soeben zum Anlegen des konkreten Datentupels verwendet; solange die Vorg&#228;nger-Chain in der L&#228;nge pa&#223;t, ist es im Grunde egal, was da sonst noch f&#252;r Datenwerte liegen, so lange wir nur grade am Ende der Vorg&#228;nger-Chain auf den Pointer zu unserem neu erzeugten Datenwert landen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1733836924774" ID="ID_1749453158" MODIFIED="1733836960815">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Konsequenz: die Funktion, die <i>an den Chain anh&#228;ngt,</i>&#160;mu&#223; die L&#228;ngen-Info haben
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1733836986637" ID="ID_1879337196" MODIFIED="1733836996216" TEXT="ist das realisierbar?">
<icon BUILTIN="help"/>
<node CREATED="1733836998431" ID="ID_26398170" MODIFIED="1733837056371" TEXT="offensichtlich einfach w&#xe4;re es aus dem Konstruktor heraus">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
insofern ist es ja schon attraktiv, mit dem Konstruktor-Funktor zu &#187;zaubern&#171;
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1733837063899" ID="ID_655018902" MODIFIED="1733837103119" TEXT="man k&#xf6;nnte diese Info im Typ des Datenrecords unterbringen">
<node CREATED="1733837116469" ID="ID_135729693" MODIFIED="1733837151564" TEXT="der Record w&#xe4;re damit sozusagen zwangsweise an eine bestimmte Position im Chain gebunden"/>
<node CREATED="1733837159239" ID="ID_115103038" MODIFIED="1733837221699">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
und k&#246;nnt nur genau in einer einzigen Weise <i>(und ein einziges Mal!)</i>
</p>
<p>
an einen Chain der richtigen L&#228;nge angeh&#228;ngt werden
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1733837104583" ID="ID_690949960" MODIFIED="1733837225743" TEXT="oh &#x2014; das klingt gut">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1733837245977" ID="ID_402273583" MODIFIED="1733837261228" TEXT="das f&#xfc;hrt zur L&#xf6;sung">
<node CREATED="1733837262561" ID="ID_74548961" MODIFIED="1733837339636">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Daten-Record wird markiert mit Template-Parameter <b><font color="#5d0b0b" face="Monospaced"><u>prefixLen</u></font></b>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1733837352697" ID="ID_1648354214" MODIFIED="1733837394585" TEXT="der bekommt eine Methode linkInto(HeteroData&amp;)"/>
<node CREATED="1733837395855" ID="ID_458018454" MODIFIED="1733837635994" TEXT="und delegiert in eine Funktion attachAtEnd(len)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
die kann unmittelbar die L&#228;nge pr&#252;fen und dann an's Ende gehen und den Pointer dort setzen
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
</node>
<node CREATED="1733840845048" ID="ID_1450938342" MODIFIED="1733840912820" TEXT="der Konstruktor wird im Umfeld des Node/Port-Builders gebraucht">
<node CREATED="1733840916534" ID="ID_1715437722" MODIFIED="1733840985121" TEXT="er schl&#xe4;gt sich in den Typ-Parametern des Weaving-Patterns nieder"/>
<node CREATED="1733841146655" ID="ID_1646616565" MODIFIED="1733841156465" TEXT="das genaue Schema ist noch nicht bekannt">
<node CREATED="1733841158166" ID="ID_1599174697" MODIFIED="1733841167740" TEXT="ist vmtl. jetzt auch nicht notwendig"/>
<node CREATED="1733841168554" ID="ID_1983622937" MODIFIED="1733841194821" TEXT="klar ist: der Resultat des Konstruktors mu&#xdf; in einen loakeln Scope fallen"/>
<node CREATED="1733841209003" ID="ID_140707844" MODIFIED="1733841226083" TEXT="&#x27f9; das WeavingPattern selber mu&#xdf; ihn direkt oder mittelbar aufrufen"/>
</node>
<node CREATED="1733841272191" ID="ID_762220617" MODIFIED="1733841298407" TEXT="gebraucht wird also ein Typ-Konstruktor (higher-order-function)">
<node CREATED="1733841300130" ID="ID_604405423" MODIFIED="1733841339817" TEXT="das ist also stets ein Aufbau au&#xdf;erhalb der eigentlichen Builder-Syntax"/>
<node CREATED="1733841342093" ID="ID_899891537" MODIFIED="1733841378065" TEXT="sie passiert im Umfeld der ganzen Builder-DSL-Anwendung">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
weil es ja f&#252;r den gesamten Teilbaum relevant ist
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1733841390686" ID="ID_419650667" MODIFIED="1733841410639" TEXT="der initiale Einstiegspunkt liegt im Default-Turnout-System"/>
<node CREATED="1733841412235" ID="ID_106981990" MODIFIED="1733841470551" TEXT="aber auch dieses selber braucht schon einen Konstruktor-Typ als Hilfsmittel"/>
<node CREATED="1733841473988" ID="ID_1993560536" MODIFIED="1733841506115" TEXT="denn aus diesem wird der Typ f&#xfc;r den Datencontainer abgenommen"/>
<node CREATED="1733841507063" ID="ID_1683308537" MODIFIED="1733841529604" TEXT="also mu&#xdf; man den initialen Konstruktor aus einem statischen Kontext direkt erzeugen k&#xf6;nnen"/>
</node>
</node>
<node CREATED="1733841584893" ID="ID_842179797" MODIFIED="1733841598361" TEXT="der Konstruktor mu&#xdf; den Typ der vollst&#xe4;ndigen Chain enthalten">
<node CREATED="1733841599726" ID="ID_1990514352" MODIFIED="1733841609437" TEXT="denn davon k&#xf6;nnen dann Accessoren erzeugt werden"/>
<node CREATED="1733841610265" ID="ID_514581574" MODIFIED="1733841631218" TEXT="damit kann auch der Follow-Up-Konstruktor in diesem Typ liegen"/>
<node CREATED="1733841632372" ID="ID_1787377298" MODIFIED="1733841669645" TEXT="nochmal: das ist die Chain in der Ausbaustrufe wie vom Konstruktor letztlich erzeugt"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1733841884473" ID="ID_1863824634" MODIFIED="1733852122494" TEXT="das k&#xf6;nnte der Ansatzpunkt f&#xfc;r die Implementierung sein">
<arrowlink COLOR="#f6ffbc" DESTINATION="ID_1314165564" ENDARROW="Default" ENDINCLINATION="46;-119;" ID="Arrow_ID_1683684415" STARTARROW="None" STARTINCLINATION="-294;14;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1733841958666" ID="ID_1314165564" MODIFIED="1733852113174" TEXT="mit dem Chain-Konstruktor beginnen">
<linktarget COLOR="#f6ffbc" DESTINATION="ID_1314165564" ENDARROW="Default" ENDINCLINATION="46;-119;" ID="Arrow_ID_1683684415" SOURCE="ID_1863824634" STARTARROW="None" STARTINCLINATION="-294;14;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1733841974800" ID="ID_1337308066" MODIFIED="1733841991425" TEXT="er ist ein Funktor, der an diese aktuelle Chain hinten anh&#xe4;ngt"/>
<node CREATED="1733842016283" ID="ID_519146605" MODIFIED="1733842037697" TEXT="mu&#xdf; also den neuen Chain-Typ per Typlisten-Anh&#xe4;ngen erzeugen"/>
<node CREATED="1733851898302" ID="ID_1548944184" MODIFIED="1733851920386" TEXT="ansonsten mu&#xdf; ja nun der Konstruktor nur noch den Storage-Frame erzeugen"/>
<node COLOR="#338800" CREATED="1733851922106" ID="ID_421589500" MODIFIED="1733852040199" TEXT="somit reduziert sich die Implementierung auf einige Typedefs">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1733851935617" ID="ID_13086801" MODIFIED="1733852025559" TEXT="und kann auch ganz einfach den Chain-Konstruktor oder die Accessoren bieten">
<arrowlink COLOR="#01ba2e" DESTINATION="ID_1021269190" ENDARROW="Default" ENDINCLINATION="-582;31;" ID="Arrow_ID_1159712630" STARTARROW="None" STARTINCLINATION="-91;0;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1733767161520" ID="ID_1853669534" MODIFIED="1733767188150" TEXT="Standard-Definition f&#xfc;r TurnoutSystem auf dieser Basis">