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:
parent
54dc8cc032
commit
56bf5ecc8e
4 changed files with 357 additions and 53 deletions
|
|
@ -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<>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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äsentiert Ä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ßt....">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Thema "Darstellung von Objekt-Feldern im Diff"
|
||||
|
|
@ -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önnte ein konkretes mix-In sein; d.h. zumindest die DisplayMetric wä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ären mutable Variable, die per Setter geändert werden können...
|
||||
|
|
@ -24417,9 +24409,7 @@
|
|||
<node CREATED="1583103686706" ID="ID_1021464384" MODIFIED="1583103698796" TEXT="wir nä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änderten Vorgaben eine Platz-Allokation zu machen. Und diese Hilfe können wir nicht synchron anfordern, sondern triggern sie indirekt durch setzen neuer Mindestgrößen...
|
||||
|
|
@ -26507,9 +26497,7 @@
|
|||
<icon BUILTIN="help"/>
|
||||
<node COLOR="#990000" CREATED="1576974036176" ID="ID_1084997647" MODIFIED="1611478475301" TEXT="wenn ja: dann hätten wir ein Problem mit remove()">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
weil dieses nämlich keine Koordinaten bekommt, und daher nicht weiß, 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ä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>
|
||||
  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ür mich eine neue Einsicht.
|
||||
|
|
@ -38970,9 +38952,7 @@
|
|||
<node CREATED="1619903180827" ID="ID_250477630" MODIFIED="1619903245581" TEXT="darüber muß ich wohl (zunächst?) großzü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öst über lokales Widget-Binding"/>
|
||||
<node CREATED="1661696271684" ID="ID_1004582513" MODIFIED="1661696338493" TEXT="könnte auch durch ein generisches Fallback-Binding ausgelöst werden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
ich meine rechts-Klick; typischerweise implementiert man den Handler dafür auf einem Canvas; aber dann ist das Problem: wie findet der Handler das konkrete Widget, und von diesem den Kontext für das pop-Up?
|
||||
|
|
@ -40287,9 +40265,7 @@
|
|||
</node>
|
||||
<node CREATED="1666966240650" ID="ID_248937535" MODIFIED="1666966303328" TEXT="es gäbe mehrfach-Benachrichtigung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
denn aufgrund der ersten (ggfs sogar <b>falschen</b> Benachrichtigung) würde das ZoomWindow selber die Parameter glattziehen, was erneute Benachrichtigung zur Folge hä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> Eingangswerte zuläßt, und sich eben nicht nur auf <i>vernünftige </i>Eingaben <i>verläß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ü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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1733804529591" ID="ID_811390325" MODIFIED="1733804573211" TEXT="Accessor als nested Template ⟹ enthä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ötigt">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1733851479790" ID="ID_1737189268" MODIFIED="1733851545929" TEXT="anders wäre es nicht sinnvoll...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...obzwar möglich, kann man nicht sinnvollerweise vom Benutzer verlangen, daß der den Basis-Offset kennt — und obendrein wä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ö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ö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ür gefährlich, wenn sie im Fehlerfall -1 zurückgibt.
|
||||
</p>
|
||||
<p>
|
||||
Konkret ist das Problem, daß die Fold-Expression von meinem Compiler nicht als constexpr akzeptiert wird (weil man ja über die Fold-Expression einen Index inkrementiert). Möglicherweise wü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ö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 ü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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
bei Aufruf wird dann der eigentliche Storage-Frame <i>erzeugt <b>und</b>  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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
und <i>diese</i> muß nun in einen Vorgä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ätzlichen pointer-Parameter"/>
|
||||
<node CREATED="1733804972427" ID="ID_1289574080" MODIFIED="1733804987877" TEXT="Idee-2 : etwas mit Lambdas zaubern....?">
|
||||
|
|
@ -87918,6 +87933,242 @@ Date:   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ä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&)"/>
|
||||
<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 »dekoriert« 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ück"/>
|
||||
</node>
|
||||
<node CREATED="1733834687569" ID="ID_363279018" MODIFIED="1733834714657" TEXT="der Funktor fü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 ü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> stammt — nämlich von dem Builder aus dem High-Level-Model gewrappt, z.B. Auswertung einer Bé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äß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ßlich muß dieses Datenobjekt noch an die HeteroData-chain angehängt werden"/>
|
||||
<node CREATED="1733835380949" ID="ID_717968240" MODIFIED="1733835397291" TEXT="Ü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ßen verständlich machen" VSHIFT="7"/>
|
||||
<node BACKGROUND_COLOR="#d6d3b7" CREATED="1733835399954" ID="ID_1456102629" MODIFIED="1733835639063" TEXT="gut wenn man eine Nacht über Probleme schläft">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
gestern habe ich mich furchbar geplagt, weil ich fest davon überzeugt war, daß dieses Anhängen im Konstruktor untergebracht werden muß
|
||||
</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üpfen könnte man <i>rückwärts gehend</i> einleiten
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1733835810003" ID="ID_322730027" MODIFIED="1733835932550" TEXT="also als Funktion auf dem erzeugten Datenblock: linkInto(TurnoutSystem&)"/>
|
||||
<node CREATED="1733835981732" ID="ID_483075213" MODIFIED="1733836127364" TEXT="Grund: ich suche nach einer Mö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ö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ür alle Nodes gleich
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1733836189832" ID="ID_608912126" MODIFIED="1733836267145" TEXT="gewünscht wäre, daß der später verwendete Accessor an dieser Stelle garantiert paßt"/>
|
||||
<node CREATED="1733836283366" ID="ID_1204057143" MODIFIED="1733836294577" TEXT="das ist nun aber schwierig, und auch fragwü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üfen wäre also, ob der Datenrecord tatsächlich seinem Typ gemäß angehängt wird"/>
|
||||
<node CREATED="1733836403236" ID="ID_97000599" MODIFIED="1733836479233" TEXT="die zum Anhängen notwendige Zugangs-Funktion muß 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öglich und aber auch genau hinreichend wäre jedoch ein Plausibilitäts-Check">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...dieser Check würde prüfen, ob wir nach einer vorkonfigurierten Anzahl an Schritten exakt hinter dem Ende des aktuellen Chain stehen — denn <i>genau dann</i> 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änger-Chain in der Länge paßt, ist es im Grunde egal, was da sonst noch für Datenwerte liegen, so lange wir nur grade am Ende der Vorgä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ängt,</i> muß die Lä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äre es aus dem Konstruktor heraus">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
insofern ist es ja schon attraktiv, mit dem Konstruktor-Funktor zu »zaubern«
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1733837063899" ID="ID_655018902" MODIFIED="1733837103119" TEXT="man könnte diese Info im Typ des Datenrecords unterbringen">
|
||||
<node CREATED="1733837116469" ID="ID_135729693" MODIFIED="1733837151564" TEXT="der Record wä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önnt nur genau in einer einzigen Weise <i>(und ein einziges Mal!)</i>
|
||||
</p>
|
||||
<p>
|
||||
an einen Chain der richtigen Länge angehängt werden
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1733837104583" ID="ID_690949960" MODIFIED="1733837225743" TEXT="oh — das klingt gut">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1733837245977" ID="ID_402273583" MODIFIED="1733837261228" TEXT="das führt zur Lö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&)"/>
|
||||
<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änge prü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ä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ß in einen loakeln Scope fallen"/>
|
||||
<node CREATED="1733841209003" ID="ID_140707844" MODIFIED="1733841226083" TEXT="⟹ das WeavingPattern selber muß 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ß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ü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ür den Datencontainer abgenommen"/>
|
||||
<node CREATED="1733841507063" ID="ID_1683308537" MODIFIED="1733841529604" TEXT="also muß man den initialen Konstruktor aus einem statischen Kontext direkt erzeugen können"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1733841584893" ID="ID_842179797" MODIFIED="1733841598361" TEXT="der Konstruktor muß den Typ der vollständigen Chain enthalten">
|
||||
<node CREATED="1733841599726" ID="ID_1990514352" MODIFIED="1733841609437" TEXT="denn davon kö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önnte der Ansatzpunkt fü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ängt"/>
|
||||
<node CREATED="1733842016283" ID="ID_519146605" MODIFIED="1733842037697" TEXT="muß also den neuen Chain-Typ per Typlisten-Anhängen erzeugen"/>
|
||||
<node CREATED="1733851898302" ID="ID_1548944184" MODIFIED="1733851920386" TEXT="ansonsten muß 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ür TurnoutSystem auf dieser Basis">
|
||||
|
|
|
|||
Loading…
Reference in a new issue