Invocation: reconsider how layout of the FeedManifold is established

This is a first step towards the goal to introduce a ''parameter tuple'' into the `FeedManifold`.
Doing so invalidates some of the previously taken decisions regarding the `FeedManifold`;
at that time I was still under the impression of the old design from 2012, which called for a ''Buffer Table''.
Now we are forced to allow for more leeway in the function definition; even more so, since the limitation
to one single input and output Buffer type can be deemed unrealistic anyway.
So why sticking to an array at all? ''Buffers could also be a tuple...''

Seemingly another reason why I used an array was the idea to somehow limit the number of template instances,
by grouping them into a few number of array sizes, like 1,2,5 and 10.
This idea falls short, since in reality it can not be avoided to have the processing function on the type signature anyway.
Thus, the only point where the number of templates could be limited lies in the library plug-in,
where this »processing function« is actually defined as an adapter.
This commit is contained in:
Fischlurch 2024-12-14 19:09:22 +01:00
parent 991f0a31f4
commit 40d088c62f
3 changed files with 333 additions and 94 deletions

View file

@ -405,7 +405,7 @@ namespace engine {
auto
PortBuilderRoot<POL,DAT>::invoke (StrView portSpec, FUN fun)
{
using WeavingBuilder_FUN = WeavingBuilder<POL, manifoldSiz<FUN>(), FUN>;
using WeavingBuilder_FUN = WeavingBuilder<POL, FUN>;
return PortBuilder<POL,DAT, WeavingBuilder_FUN>{move(*this), move(fun), portSpec};
}
/*

View file

@ -149,8 +149,8 @@ namespace engine {
static_assert(_Fun<FUN>() , "something funktion-like required");
static_assert(is_BinaryFun<FUN>() , "function with two arguments expected");
using ArgI = remove_reference_t<typename _Fun<FUN>::Args::List::Head>;
using ArgO = remove_reference_t<typename _Fun<FUN>::Args::List::Tail::Head>;
using SigI = remove_reference_t<typename _Fun<FUN>::Args::List::Head>;
using SigO = remove_reference_t<typename _Fun<FUN>::Args::List::Tail::Head>;
template<class ARG>
struct MatchBuffArray
@ -164,36 +164,14 @@ namespace engine {
enum{ SIZ = N };
};
using BuffI = typename MatchBuffArray<ArgI>::Buff;
using BuffO = typename MatchBuffArray<ArgO>::Buff;
using BuffI = typename MatchBuffArray<SigI>::Buff;
using BuffO = typename MatchBuffArray<SigO>::Buff;
enum{ FAN_I = MatchBuffArray<ArgI>::SIZ
, FAN_O = MatchBuffArray<ArgO>::SIZ
enum{ FAN_I = MatchBuffArray<SigI>::SIZ
, FAN_O = MatchBuffArray<SigO>::SIZ
, MAXSZ = std::max (uint(FAN_I), uint(FAN_O)) /////////////////////OOO required temporarily until the switch to tuples
};
};
/**
* Pick a suitable size for the FeedManifold to accommodate the given function.
* @remark only returning one of a small selection of sizes, to avoid
* excessive generation of template instances.
* @todo 10/24 this is a premature safety guard;
* need to assess if there is actually a problem
* (chances are that the optimiser absorbs most of the combinatoric complexity,
* or that, to the contrary, other proliferation mechanisms cause more harm)
*/
template<class FUN>
inline constexpr uint
manifoldSiz()
{
using _F = _ProcFun<FUN>;
auto constexpr bound = std::max (_F::FAN_I, _F::FAN_O);
static_assert (bound <= 10,
"Limitation of template instances exceeded");
return bound < 3? bound
: bound < 6? 5
: 10;
}
}//(End)Introspection helpers.
@ -221,8 +199,8 @@ namespace engine {
static_assert(FAN_I <= N and FAN_O <= N);
using ArrayI = std::array<BuffI*, FAN_I>;
using ArrayO = std::array<BuffO*, FAN_O>;
using ArrayI = typename _ProcFun<FUN>::SigI;
using ArrayO = typename _ProcFun<FUN>::SigO;
FUN process;
@ -239,7 +217,7 @@ namespace engine {
void
connect (uint fanIn, uint fanOut)
{
REQUIRE (fanIn >= FAN_I and fanOut >= FAN_O);
REQUIRE (fanIn == FAN_I and fanOut == FAN_O); //////////////////////////OOO this distinction is a left-over from the idea of fixed block sizes
for (uint i=0; i<FAN_I; ++i)
inParam[i] = & MAN::inBuff[i].template accessAs<BuffI>();
for (uint i=0; i<FAN_O; ++i)
@ -263,13 +241,13 @@ namespace engine {
* employ more elaborate _invocation adapters_
* specifically tailored to the library's needs.
*/
template<uint N, class FUN>
template<class FUN>
struct DirectFunctionInvocation
: util::MoveOnly
{
using Manifold = FeedManifold<N>;
enum{ MAX_SIZ = _ProcFun<FUN>::MAXSZ };
using Manifold = FeedManifold<MAX_SIZ>;
using Feed = SimpleFunctionInvocationAdapter<Manifold, FUN>;
enum{ MAX_SIZ = N };
std::function<Feed()> buildFeed;
@ -346,8 +324,8 @@ namespace engine {
template<uint N, class FUN>
using SimpleDirectInvoke = MediaWeavingPattern<DirectFunctionInvocation<N,FUN>>;
template<class FUN>
using SimpleDirectInvoke = MediaWeavingPattern<DirectFunctionInvocation<FUN>>;
/**
@ -364,12 +342,12 @@ namespace engine {
* @tparam N maximum number of input and output slots
* @tparam FUN function or invocation adapter to invoke
*/
template<class POL, uint N, class FUN>
template<class POL, class FUN>
struct WeavingBuilder
: util::MoveOnly
{
using FunSpec = _ProcFun<FUN>;
using TurnoutWeaving = Turnout<SimpleDirectInvoke<N,FUN>>;
using TurnoutWeaving = Turnout<SimpleDirectInvoke<FUN>>;
static constexpr SizMark<sizeof(TurnoutWeaving)> sizMark{};
static constexpr uint FAN_I = FunSpec::FAN_I;
static constexpr uint FAN_O = FunSpec::FAN_O;
@ -423,7 +401,7 @@ namespace engine {
while (cnt--)
buffTypes.emplace_back([](BufferProvider& provider)
{ return provider.getDescriptor<BU>(); });
ENSURE (buffTypes.size() <= N);
ENSURE (buffTypes.size() <= FAN_O);
return move(*this);
}
@ -474,9 +452,7 @@ namespace engine {
outTypes.append (
typeConstructor (providers[i++]));
ENSURE (leadPorts.size() <= N);
ENSURE (leadPorts.size() == FunSpec::FAN_I);
ENSURE (outTypes.size() <= N);
ENSURE (outTypes.size() == FunSpec::FAN_O);
using PortDataBuilder = DataBuilder<POL, Port>;

View file

@ -23290,9 +23290,7 @@
</node>
<node CREATED="1666485375028" ID="ID_282899643" MODIFIED="1666485530387" TEXT="DisplayFrame::getDisplayMetric()">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...das ist in der Tat eine &#252;berfl&#252;ssige Indirektion, die jedoch einen Storage-Slot einspart (weil die VTable ohnehin schon da ist). Man k&#246;nnte sehr wohl schon im Interface CanvasHook einen Pointer auf eine DisplayMetric vorsehen
@ -23849,9 +23847,7 @@
<node CREATED="1565272911999" ID="ID_505692945" MODIFIED="1565272930138" TEXT="danach folgt eine vergr&#xf6;&#xdf;ernde Abstimmung"/>
<node CREATED="1565272944612" ID="ID_559376631" MODIFIED="1582989776685">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
die Teilelemente <i>speichern</i>&#160;ihren Wert
@ -24382,9 +24378,7 @@
</node>
<node CREATED="1583434172775" ID="ID_1444249960" MODIFIED="1583434412688" TEXT="Aufgabe ist, dieses orthogonal darzustellen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Rekursion ist immer doppelb&#246;dig:
@ -25155,9 +25149,7 @@
<icon BUILTIN="flag-yellow"/>
<node CREATED="1612019625163" ID="ID_191145933" MODIFIED="1612019777333" TEXT="liegt vmtl. darin, da&#xdf; wir uns grade in einem Draw()-Callback befinden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
beim ersten Mal wird &quot;nebenbei&quot; festgestellt, da&#223; das Track-Profil (noch)nicht existiert.
@ -26367,9 +26359,7 @@
<node CREATED="1576705483541" ID="ID_707363124" MODIFIED="1576705490984" TEXT="mit verschachtelten Sub-Tracks"/>
<node CREATED="1576705491972" ID="ID_1199800790" MODIFIED="1576705509384" TEXT="verwenden des bestehenden Display-Code">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
soweit m&#246;glich ohne grundlegende &#196;nderungen
@ -28158,9 +28148,7 @@
<icon BUILTIN="idea"/>
<node CREATED="1677626302701" ID="ID_613709734" MODIFIED="1677626717065">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<u><font color="#8323d6">Fall-1</font></u>: Font-Size ist absolut gegeben &#10233;
@ -30343,9 +30331,7 @@
</node>
<node COLOR="#338800" CREATED="1566407096905" ID="ID_489535600" MODIFIED="1576282358056" TEXT="Problem: rePack- der umschlie&#xdf;enden Box">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn man PACK_SHRINK setzt, dann weist die umschlie&#223;ende Box initial
@ -31524,9 +31510,7 @@
<node CREATED="1562854560779" ID="ID_1139882401" MODIFIED="1562854560779" TEXT="gobject_ ((make_a_copy &amp;&amp; gobject) ? gtk_widget_path_copy(gobject) : gobject)"/>
<node CREATED="1562854618581" ID="ID_1356580321" MODIFIED="1562854656348" TEXT="gtk_widget_path_copy (const GtkWidgetPath *path)">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -34241,9 +34225,7 @@
</node>
<node CREATED="1584319394162" ID="ID_1919037634" MODIFIED="1584319465811" TEXT="wir wollen aber eine unn&#xf6;tige Doppel-Allokation pro Clip vermeiden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
wenn man das naiv coden w&#252;rde, dann w&#252;rden wir f&#252;r jeden Clip erst mal einen ClipData-Placeholder erzeugen, nur um dann, nach dem Empfangen des vollst&#228;ndigen Diff, diesen wieder zu deallozieren und daf&#252;r ein ClipWidget zu erzeugen...
@ -36491,9 +36473,7 @@
<node CREATED="1532789869240" ID="ID_752154716" MODIFIED="1561827465307" TEXT="gtk_key_snooper_install()">
<node CREATED="1532790015889" ID="ID_1497534470" MODIFIED="1576282358029" TEXT="@deprecated: 3.4">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
@deprecated: 3.4: Key snooping should not be done. Events should&#160;&#160;be handled by widgets
@ -37690,9 +37670,7 @@
<node CREATED="1616712031119" ID="ID_17685044" MODIFIED="1616712197269" TEXT="also &quot;Clip-Move&quot; vs &quot;Clip-Attach&quot; vs &quot;Clip-Trim&quot;"/>
<node CREATED="1616712201691" ID="ID_1586890794" MODIFIED="1616712288188" TEXT="denn es sind nicht so viele, da&#xdf; eine zus&#xe4;tzliche Abstraktionsstufe gerechtfertig w&#xe4;re">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Und au&#223;erdem: die Wiederverwendung einer Implementierung z.B. f&#252;r Dragging kann man per Vererbung oder per nested component lokal in der Implementierung regeln
@ -38592,9 +38570,7 @@
</node>
<node CREATED="1619698681269" ID="ID_969574933" LINK="#ID_1202075896" MODIFIED="1666476922140">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Name: <b>DisplayMetric</b>
@ -38901,9 +38877,7 @@
</html></richcontent>
<node CREATED="1620406188961" ID="ID_1221022666" MODIFIED="1620406231393" TEXT="man kann ihn nicht einmal constexpr machen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...auch daran kann ich mich jetzt wieder erinnern...<br />Dann w&#228;re n&#228;mlich das Handle nicht mehr kopierbar
@ -39141,9 +39115,7 @@
<icon BUILTIN="button_cancel"/>
<node CREATED="1621095839443" ID="ID_995526022" MODIFIED="1621095889081" TEXT="Begr&#xfc;ndung: das Delta sollte im Gesten-Controller bereinigt werden">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
aber das von GDK gelieferte Delta h&#228;ngt eben vom GDK-Window des widgets ab
@ -89993,8 +89965,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
...w&#228;hrend Ausgabepuffer zwar an der Stelle <i>committed</i>&#160;werden, aber &#187;der&#171; Ausgabepuffer wird noch nicht freigegeben, denn er ist ja Eingabepuffer der Nachfolger-Node
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1734137533539" ID="ID_253613495" MODIFIED="1734139667487" TEXT="beide Vorg&#xe4;nge m&#xfc;ssen f&#xfc;r einen In/Out-Buffer (in-place processing) unterbunden werden">
<arrowlink COLOR="#e31763" DESTINATION="ID_1612398167" ENDARROW="Default" ENDINCLINATION="819;-857;" ID="Arrow_ID_166926203" STARTARROW="None" STARTINCLINATION="368;12;"/>
@ -91343,6 +91314,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734133537741" ID="ID_1672200590" MODIFIED="1734133557814" TEXT="(bisher:) zwei homogene Arrays"/>
<node CREATED="1734134261731" ID="ID_1882489689" MODIFIED="1734134267038" TEXT="Varianten f&#xfc;r Buffer">
<node CREATED="1734134268698" ID="ID_735163966" MODIFIED="1734134273269" TEXT="nur Output"/>
<node CREATED="1734188744367" ID="ID_318402472" MODIFIED="1734188751794" TEXT="heterogene Buffer-Typen"/>
</node>
<node CREATED="1734133572817" ID="ID_1508896644" MODIFIED="1734133584594" TEXT="zus&#xe4;tzlicher 1.Parameter">
<node CREATED="1734133597805" ID="ID_1336464816" MODIFIED="1734133717178" TEXT="als beliebiger einzel-Wert">
@ -91358,10 +91330,261 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734133611115" ID="ID_140148557" MODIFIED="1734133616455" TEXT="als Tupel"/>
</node>
</node>
<node CREATED="1734188779125" ID="ID_978315882" MODIFIED="1734188785169" TEXT="Fallunterscheidung">
<node CREATED="1734188787125" ID="ID_1834748970" MODIFIED="1734188798681" TEXT="anhand der Arit&#xe4;t">
<node CREATED="1734188806962" ID="ID_390772438" MODIFIED="1734188832010" TEXT="terti&#xe4;r: Zuordnung ist eindeutig">
<node CREATED="1734189402282" ID="ID_1540995607" MODIFIED="1734189410440" TEXT="1:param"/>
<node CREATED="1734189411779" ID="ID_496340085" MODIFIED="1734189416340" TEXT="2:input"/>
<node CREATED="1734189418040" ID="ID_66062728" MODIFIED="1734189421913" TEXT="3:output"/>
</node>
<node CREATED="1734189445812" ID="ID_127959416" MODIFIED="1734189461003" TEXT="bin&#xe4;r: zwei F&#xe4;lle m&#xf6;glich">
<node CREATED="1734189501078" ID="ID_1586417036" MODIFIED="1734189507320" TEXT="keine Parameter">
<node CREATED="1734189523594" ID="ID_1532795879" MODIFIED="1734189528465" TEXT="1:input"/>
<node CREATED="1734189532385" ID="ID_133166724" MODIFIED="1734189536506" TEXT="2:output"/>
</node>
<node CREATED="1734189508568" ID="ID_340518030" MODIFIED="1734189521240" TEXT="reine SourceNode">
<node CREATED="1734189541335" ID="ID_58837735" MODIFIED="1734189545299" TEXT="1:param"/>
<node CREATED="1734189547033" ID="ID_999171046" MODIFIED="1734189551353" TEXT="2:output"/>
</node>
</node>
<node CREATED="1734189553822" ID="ID_371378428" MODIFIED="1734189613602" TEXT="un&#xe4;r: eindeutig SourceNode ohne Parameter">
<node CREATED="1734189615374" ID="ID_989328103" MODIFIED="1734189620257" TEXT="1:output"/>
</node>
</node>
<node CREATED="1734190083910" ID="ID_1977104281" MODIFIED="1734190090785" TEXT="Typ-F&#xe4;lle">
<node CREATED="1734190098316" ID="ID_555764595" MODIFIED="1734190109718" TEXT="zun&#xe4;chst ist eine Typ-Sequenz zu extrahieren"/>
<node CREATED="1734190483904" ID="ID_1819780350" MODIFIED="1734190500562" TEXT="wenn alle Typen Pointer sind &#x27f9; Buffer"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734191239971" ID="ID_114334831" MODIFIED="1734191249066" TEXT="Traits differenzieren">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1734191250817" ID="ID_1191066600" MODIFIED="1734191255564" TEXT="_ProcFun">
<node CREATED="1734191297683" ID="ID_1345489513" MODIFIED="1734191301478" TEXT="Interface">
<node CREATED="1734197766903" ID="ID_673979515" MODIFIED="1734197771095" TEXT="Sig">
<node COLOR="#571c9a" CREATED="1734197197766" HGAP="33" ID="ID_591771944" MODIFIED="1734197816485" TEXT="komplette Funktions-Signatur" VSHIFT="3">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node CREATED="1734197176174" ID="ID_1317605048" MODIFIED="1734197730300" TEXT="SigP">
<node COLOR="#571c9a" CREATED="1734197197766" HGAP="25" ID="ID_387316898" MODIFIED="1734197855420" TEXT="erwarteter Signatur-Typ f&#xfc;r Parameter" VSHIFT="3">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node CREATED="1734197182853" ID="ID_301451402" MODIFIED="1734197730301" TEXT="SigI"/>
<node CREATED="1734197187949" ID="ID_1412611110" MODIFIED="1734197730301" TEXT="SigO"/>
<node CREATED="1734197176174" ID="ID_658600806" MODIFIED="1734197194774" TEXT="ArgP">
<node COLOR="#571c9a" CREATED="1734197197766" HGAP="25" ID="ID_1706419734" MODIFIED="1734197278702" TEXT="Types&lt;...&gt;" VSHIFT="3">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node CREATED="1734197182853" ID="ID_911130658" MODIFIED="1734197186496" TEXT="ArgI"/>
<node CREATED="1734197187949" ID="ID_1356222325" MODIFIED="1734197191242" TEXT="ArgO"/>
<node CREATED="1734197286103" ID="ID_1007382219" MODIFIED="1734197295522" TEXT="FAN_I">
<node COLOR="#571c9a" CREATED="1734197197766" HGAP="25" ID="ID_1896822938" MODIFIED="1734197326334" TEXT="Konstanten (f&#xfc;r Array-Def)" VSHIFT="3">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node CREATED="1734197297083" ID="ID_1519265153" MODIFIED="1734197300389" TEXT="FAN_O"/>
<node CREATED="1734197573721" ID="ID_934034330" MODIFIED="1734197589057" TEXT="SLOT_I">
<node COLOR="#571c9a" CREATED="1734197197766" HGAP="25" ID="ID_1836695215" MODIFIED="1734197881325" TEXT="Slot-# der Funktion" VSHIFT="3">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
<node CREATED="1734197580632" ID="ID_471999378" MODIFIED="1734197586731" TEXT="SLOT_O"/>
<node CREATED="1734197463558" ID="ID_1084339659" MODIFIED="1734198442856" TEXT="hasInput() &#x2254; SLOT_I &#x2260; SLOT_O"/>
<node CREATED="1734197436811" ID="ID_218618324" MODIFIED="1734198590894" TEXT="hasParam() &#x2254; 0 &lt; SLOT_I">
<node CREATED="1734198461292" HGAP="22" ID="ID_1230777508" MODIFIED="1734198560559" TEXT="(folgt implizit)" VSHIFT="3">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...weil wir SLOT_I &#8788; SLOT_O setzen (wichtig!), wenn es keinen Input gibt; es gibt nur zwei F&#228;lle ohne Parameter, und die lsassen sich damit in diesen Test zusammenfassen
</p>
</body>
</html>
</richcontent>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734197949703" ID="ID_614756914" MODIFIED="1734197958950" TEXT="in zwei Schritten umstellen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734197960677" ID="ID_928664533" MODIFIED="1734198014600" TEXT="Schritt-1 : neues Interface">
<node CREATED="1734198655392" ID="ID_1607922853" MODIFIED="1734198689626" TEXT="kann ArgI|O sofort umbenennen &#x27fc; SigI|O">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
da es nur in Traits selber verwendet wird
</p>
</body>
</html></richcontent>
</node>
<node COLOR="#5b280f" CREATED="1734210007691" ID="ID_824110488" MODIFIED="1734210121348" TEXT="dann ArrayI|O ebenfalls auf SigI|O zur&#xfc;ckf&#xfc;hren">
<icon BUILTIN="button_cancel"/>
<node CREATED="1734210123451" ID="ID_1200047403" MODIFIED="1734210132804" TEXT="besser sp&#xe4;ter gleich ganz zur&#xfc;ckbauen"/>
<node CREATED="1734210134329" ID="ID_601691761" MODIFIED="1734210146556" TEXT="denn das einheitliche BuffI / BuffO f&#xe4;llt weg"/>
</node>
<node CREATED="1734210231821" ID="ID_1763909056" MODIFIED="1734210238791" TEXT="Parameter N zur&#xfc;ckbauen">
<node CREATED="1734210771451" ID="ID_577304307" MODIFIED="1734210825368" TEXT="etwas kniffelig...">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
denn im Moment wird der ja wirklich gebraucht, da die FeedManifold noch eine fixed-size-Allocaiton macht
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1734210827182" ID="ID_1319366507" MODIFIED="1734210848869" TEXT="erst mal &#xbb;abh&#xe4;ngen&#xab; und ein jeweils passendes Array direkt konstruieren"/>
<node CREATED="1734210854384" ID="ID_249077721" MODIFIED="1734210868794" TEXT="dann auch das Array auf den Typ aus SigO | SigI schwenken">
<node CREATED="1734210988102" ID="ID_1290179575" MODIFIED="1734210995425" TEXT="Assertions sch&#xe4;rfen"/>
<node CREATED="1734210996653" ID="ID_1230198498" MODIFIED="1734211181336" TEXT="nun FAN_I == leadPorts.size()"/>
<node CREATED="1734211182900" ID="ID_419468849" MODIFIED="1734211201666" TEXT="und FAN_O == outTypes.size()"/>
<node CREATED="1734211213967" ID="ID_700968343" MODIFIED="1734211234769" TEXT="das wird in terminaler BuilderOp ohnehin so sichergestellt"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734197971763" ID="ID_1977596531" MODIFIED="1734197997067" TEXT="Schritt-2 : tats&#xe4;chliche Flexibilit&#xe4;t"/>
</node>
</node>
<node CREATED="1734191257640" ID="ID_1241232500" MODIFIED="1734191262543" TEXT="_ParamFun"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133384146" ID="ID_250842155" MODIFIED="1734133516983" TEXT="Typ-Steuerung im Builder &#xfc;berarbeiten">
<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">
<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">
<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">
<icon BUILTIN="clanbomber"/>
</node>
<node CREATED="1734192098399" ID="ID_1972074994" MODIFIED="1734192158004">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
das Template <b><font face="Monospaced">DirectFunctionInvocation&lt;N,</font><font face="Monospaced" color="#c00606">FUN</font><font face="Monospaced">&gt;</font></b>&#160; ist der Hebel
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1734192172912" ID="ID_1482415574" MODIFIED="1734192186159" TEXT="&#x27f9; bisher war diese Limitierung wirkungslos"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734192187435" ID="ID_322033181" MODIFIED="1734196261814" TEXT="Erweiterung auf beliebigen Buffer-Mix &#x27f9; Limitierung grunds&#xe4;tzlich nicht haltbar">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Und ich sehe keinerlei Basis, um einen beliebigen Buffer-Mix ausschlie&#223;en zu k&#246;nnen. Denn wir wollen <i>beliebige, nicht weiter bekannte Libraries</i>&#160;adaptieren k&#246;nnen. Die einzige verbleibende Barriere ist FUN selber, denn das kann auch ein generischer Adapter aus dem Library-Plugin sein; jedoch <i>Vorgaben k&#246;nnen wir keine machen. </i>
</p>
<p>
<b><font color="#840c28">Jede m&#246;gliche Funktions-Signatur erzeugt eine separate Turnout-Instanz</font></b>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#d1aea3" COLOR="#523d5f" CREATED="1734193627969" ID="ID_1410642266" MODIFIED="1734193725381">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
das Media-Lib-Plugin is Problemzone und Ansatzpunkt bzgl <b>Template-Bloat</b>
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734194266853" HGAP="31" ID="ID_17132445" MODIFIED="1734194303269" TEXT="aber: auch Param-Funktor spielt nun eine Rolle..." VSHIFT="-6">
<icon BUILTIN="idea"/>
</node>
</node>
<node CREATED="1734193735891" ID="ID_1291324373" MODIFIED="1734193801830" TEXT="man k&#xf6;nnte dort...">
<node CREATED="1734193744090" ID="ID_224227606" MODIFIED="1734193795354" TEXT="Aufruf-Signaturen aggressiv vereinheitlichen"/>
<node CREATED="1734193804568" ID="ID_1133557973" MODIFIED="1734193849964" TEXT="wenige generische Invocation-Adapter einsetzen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Trade-off: daf&#252;r dann eine runtime-Indirection
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238837562" HGAP="148" ID="ID_1378608706" MODIFIED="1734197120171" STYLE="bubble" TEXT="Hebel f&#xfc;r sp&#xe4;ter im Blick zu behalten" VSHIFT="44">
<edge COLOR="#ff5d00" STYLE="sharp_linear"/>
<arrowlink COLOR="#fe512a" DESTINATION="ID_1353514662" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_1188578396" STARTARROW="None" STARTINCLINATION="-832;60;"/>
<arrowlink COLOR="#f94771" DESTINATION="ID_320753034" ENDARROW="None" ENDINCLINATION="1267;-43;" ID="Arrow_ID_735039883" STARTARROW="None" STARTINCLINATION="-749;52;"/>
<icon BUILTIN="bell"/>
<node CREATED="1721239003353" HGAP="17" ID="ID_611651911" MODIFIED="1734194192181" STYLE="fork" TEXT="Struktur des Mapping im konkreten Media-Lib-Plugin" VSHIFT="6">
<font NAME="SansSerif" SIZE="8"/>
</node>
<node CREATED="1721239003353" ID="ID_1840265118" MODIFIED="1734196739366" STYLE="fork" TEXT="Einschr&#xe4;nkung m&#xf6;glicher Parameter-Typen">
<arrowlink COLOR="#ffce83" DESTINATION="ID_1544572814" ENDARROW="Default" ENDINCLINATION="503;27;" ID="Arrow_ID_551475375" STARTARROW="None" STARTINCLINATION="342;25;"/>
<font NAME="SansSerif" SIZE="8"/>
</node>
<node CREATED="1721239003353" ID="ID_1794621311" MODIFIED="1734194181852" STYLE="fork" TEXT="Governance f&#xfc;r diesen Belang?">
<font NAME="SansSerif" SIZE="8"/>
</node>
</node>
</node>
</node>
<node CREATED="1734199120857" ID="ID_1343294838" MODIFIED="1734199129917" 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"/>
<node CREATED="1734199278268" ID="ID_1094591472" MODIFIED="1734199295893" TEXT="ist zwar alles Stack &#x2014; also optimierbar"/>
<node COLOR="#5b280f" CREATED="1734199297478" ID="ID_1145567175" MODIFIED="1734199310989" TEXT="trotzdem &#xfc;berraschend!">
<icon BUILTIN="stop-sign"/>
<node CREATED="1734199478754" ID="ID_1130097864" MODIFIED="1734199501515" TEXT="au&#xdf;erdem machen wir da einen force-cast per UninitialisedStorage::accessAs&lt;Buff*&gt;"/>
<node COLOR="#984394" CREATED="1734199540129" ID="ID_1311547067" MODIFIED="1734199718508" TEXT="dieser Code ist noch nicht wirklich gelaufen....">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...denn exakt an dieser Stelle ist das Prototyping bis jetzt gescheitert ... wir konnten bisher nur eine &#8222;d&#228;mliche&#8220; Dummy-Funktion binden; sobald eine <i>echte Dummy-Funktion</i>&#160;eingebunden werden sollte, bin ich darauf aufmerksam geworden, das eine solche Funktion zwangsl&#228;ufig auch weitere Parameter brauchen wird, und nach einer weiteren, langen &#8222;Denk-Schleife&#8220; bin ich hier wo ich grad bin
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734199504590" ID="ID_1634729169" MODIFIED="1734199538866" TEXT="das &#x201e;riecht&#x201c; nach einem Bug.....">
<icon BUILTIN="broken-line"/>
</node>
<node BACKGROUND_COLOR="#e0c0aa" COLOR="#bc9680" CREATED="1734199722245" ID="ID_1646832860" MODIFIED="1734199762689" TEXT="au Mann">
<icon BUILTIN="smiley-oh"/>
</node>
</node>
</node>
<node CREATED="1734209738024" ID="ID_312689837" MODIFIED="1734209751009" TEXT="Feststellung: es sind eigentlich zwei Schritte">
<node CREATED="1734209753285" ID="ID_829825183" MODIFIED="1734209762244" TEXT="konkrete BuffHandle bekommen"/>
<node CREATED="1734209764915" ID="ID_1757044461" MODIFIED="1734209805461" TEXT="diese in die von Funktion erwartete Datenstruktur mappen"/>
<node CREATED="1734209809669" ID="ID_1176368122" MODIFIED="1734209820904" TEXT="das Mapping ist aber stets 1:1">
<node CREATED="1734209895770" ID="ID_71007726" MODIFIED="1734209921242" TEXT="bis auf den Unterschied N vs FAN_I|O vs fanIn|Out"/>
<node CREATED="1734209929895" ID="ID_1873459172" MODIFIED="1734209949347" TEXT="...was umso mehr zeigt da&#xdf; dieser verschwinden sollte!">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734196584853" ID="ID_1949228582" MODIFIED="1734196598973" TEXT="Anordnung des Parameters f&#xfc;r den Typ-Funktor bedenken">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1734196602500" ID="ID_1286582916" MODIFIED="1734196617685" TEXT="er sollte von der Funktion separierbar sein"/>
<node CREATED="1734196618969" ID="ID_640106632" MODIFIED="1734196896465" TEXT="oder alternativ komplett von der Funktion abgeleitet">
<linktarget COLOR="#7d7fd1" DESTINATION="ID_640106632" ENDARROW="Default" ENDINCLINATION="126;7;" ID="Arrow_ID_1055059428" SOURCE="ID_1457253482" STARTARROW="None" STARTINCLINATION="131;7;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734132967020" ID="ID_1354544776" MODIFIED="1734133516984" TEXT="Param-Tuple in FeedManifold aufnehmen">
<icon BUILTIN="flag-yellow"/>
@ -91369,6 +91592,39 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133400400" ID="ID_1364724277" MODIFIED="1734141875620" TEXT="zus&#xe4;tzlichen Funktor f&#xfc;r die Parameter akzeptieren">
<arrowlink COLOR="#c0023e" DESTINATION="ID_1127056731" ENDARROW="Default" ENDINCLINATION="-1257;-48;" ID="Arrow_ID_1717201620" STARTARROW="None" STARTINCLINATION="-908;50;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734196306235" ID="ID_1975026226" MODIFIED="1734196338552" TEXT="Funktor geht mit in den Turnout-Typ ein">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1734196346326" ID="ID_362452179" MODIFIED="1734196435265" TEXT="std::function hier kann Template-Bloat reduzieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...insofern dann alle F&#228;lle mit gleicher Signatur zusammenfallen; f&#252;r die h&#228;ufigsten F&#228;lle (wie z.B. ein einziger int-Parameter) erwarte ich einen starken Hebel
</p>
</body>
</html>
</richcontent>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734196763636" ID="ID_1457253482" MODIFIED="1734196896465" TEXT="tats&#xe4;chliche Wirksamkeit h&#xe4;ngt von realem Nutzen ab">
<arrowlink COLOR="#7d7fd1" DESTINATION="ID_640106632" ENDARROW="Default" ENDINCLINATION="126;7;" ID="Arrow_ID_1055059428" STARTARROW="None" STARTINCLINATION="131;7;"/>
<icon BUILTIN="hourglass"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734196452272" HGAP="28" ID="ID_1812538453" MODIFIED="1734196932166" TEXT="bleibt jedoch trade-off &#x2014; durchaus h&#xe4;ufig aufgerufen" VSHIFT="-8">
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238837562" HGAP="148" ID="ID_1631533844" MODIFIED="1734197057405" STYLE="bubble" TEXT="weiterer Trade-off" VSHIFT="44">
<edge COLOR="#ff5d00" STYLE="sharp_linear"/>
<arrowlink COLOR="#fe512a" DESTINATION="ID_1353514662" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_147584569" STARTARROW="None" STARTINCLINATION="-832;60;"/>
<icon BUILTIN="bell"/>
<node CREATED="1721239003353" HGAP="17" ID="ID_252054004" MODIFIED="1734196548679" STYLE="fork" TEXT="Steuerung der Typwahl im Weaving-Pattern" VSHIFT="6">
<font NAME="SansSerif" SIZE="8"/>
</node>
<node CREATED="1721239003353" ID="ID_1544572814" MODIFIED="1734196739366" STYLE="fork" TEXT="aber auch: Reduktion des Parameter-Typ-Universums">
<linktarget COLOR="#ffce83" DESTINATION="ID_1544572814" ENDARROW="Default" ENDINCLINATION="503;27;" ID="Arrow_ID_551475375" SOURCE="ID_1840265118" STARTARROW="None" STARTINCLINATION="342;25;"/>
<font NAME="SansSerif" SIZE="8"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133441531" ID="ID_109108903" MODIFIED="1734133509736" TEXT="Turnout-Sytem mit Storage implementieren">
@ -92737,8 +92993,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
sollte <i>&#187;im Prinzip&#171;</i>&#160;auf das bestehende Schema aufgepflantzt werden
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734139617787" ID="ID_1074190304" MODIFIED="1734139649100" TEXT="Es gibt zwei Gefahrenstellen bzgl. Buffer-Lebenszyklus">
<icon BUILTIN="messagebox_warning"/>
@ -94278,9 +94533,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734139914450" ID="ID_284201304" MODIFIED="1734141541281" TEXT="Steuerung der Parameter-Verarbeitung">
<linktarget COLOR="#d90755" DESTINATION="ID_284201304" ENDARROW="Default" ENDINCLINATION="428;-33;" ID="Arrow_ID_1685749535" SOURCE="ID_1127056731" STARTARROW="None" STARTINCLINATION="-2201;158;"/>
<linktarget COLOR="#a71e73" DESTINATION="ID_284201304" ENDARROW="Default" ENDINCLINATION="-170;12;" ID="Arrow_ID_170732865" SOURCE="ID_616768316" STARTARROW="None" STARTINCLINATION="150;11;"/>
<linktarget COLOR="#c33786" DESTINATION="ID_284201304" ENDARROW="Default" ENDINCLINATION="-149;10;" ID="Arrow_ID_1396373869" SOURCE="ID_1184999563" STARTARROW="None" STARTINCLINATION="335;-34;"/>
<linktarget COLOR="#d90755" DESTINATION="ID_284201304" ENDARROW="Default" ENDINCLINATION="428;-33;" ID="Arrow_ID_1685749535" SOURCE="ID_1127056731" STARTARROW="None" STARTINCLINATION="-2201;158;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734139929944" ID="ID_1156222347" MODIFIED="1734140153468" TEXT="Steuerung von In/Out-Buffer Varianten">
@ -96068,7 +96323,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1719968185473" ID="ID_1239704157" MODIFIED="1719968217280" TEXT="ein bestimmtes Resultat-BuffHandle wird weitergegeben und nicht geschlossen"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1719787368938" ID="ID_1123241919" MODIFIED="1728606826787" TEXT="freie Kombinatorik geschickt vermeiden">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1719787368938" ID="ID_1123241919" MODIFIED="1734197007446" TEXT="freie Kombinatorik geschickt vermeiden">
<arrowlink COLOR="#ff1551" DESTINATION="ID_1233624332" ENDARROW="Default" ENDINCLINATION="-1880;100;" ID="Arrow_ID_62498933" STARTARROW="None" STARTINCLINATION="4449;305;"/>
<linktarget COLOR="#8d0757" DESTINATION="ID_1123241919" ENDARROW="Default" ENDINCLINATION="-491;33;" ID="Arrow_ID_771540131" SOURCE="ID_1412088712" STARTARROW="None" STARTINCLINATION="-327;758;"/>
<icon BUILTIN="yes"/>
@ -96076,6 +96331,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#a5075a" DESTINATION="ID_1997478599" ENDARROW="Default" ENDINCLINATION="-1987;137;" ID="Arrow_ID_830705993" STARTARROW="None" STARTINCLINATION="118;7;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238814245" HGAP="34" ID="ID_320753034" MODIFIED="1734197120171" TEXT="Gefahr f&#xfc;r Template-Bloat im Media-Lib-Plug-in" VSHIFT="-1">
<linktarget COLOR="#f94771" DESTINATION="ID_320753034" ENDARROW="None" ENDINCLINATION="1267;-43;" ID="Arrow_ID_735039883" SOURCE="ID_1378608706" STARTARROW="None" STARTINCLINATION="-749;52;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1730486371054" HGAP="24" ID="ID_939499486" MODIFIED="1730487590452" TEXT="Node-Metadaten" VSHIFT="7">
@ -97019,8 +97278,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238814245" ID="ID_1330725144" MODIFIED="1734139688131" TEXT="Aufgabe: Markierung und Spezialbehandlung f&#xfc;r In/Out-Parameter">
<linktarget COLOR="#fee2f8" DESTINATION="ID_1330725144" ENDARROW="Default" ENDINCLINATION="294;12;" ID="Arrow_ID_316718831" SOURCE="ID_194906054" STARTARROW="None" STARTINCLINATION="545;31;"/>
<linktarget COLOR="#fe512a" DESTINATION="ID_1330725144" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_494242518" SOURCE="ID_1612398167" STARTARROW="None" STARTINCLINATION="-1703;73;"/>
<linktarget COLOR="#fee2f8" DESTINATION="ID_1330725144" ENDARROW="Default" ENDINCLINATION="294;12;" ID="Arrow_ID_316718831" SOURCE="ID_194906054" STARTARROW="None" STARTINCLINATION="545;31;"/>
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721238814245" ID="ID_1353514662" MODIFIED="1734197109463" TEXT="Aufgabe: Template-Bloat im Media-Lib-Plug-in beachten">
<linktarget COLOR="#fe512a" DESTINATION="ID_1353514662" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_1188578396" SOURCE="ID_1378608706" STARTARROW="None" STARTINCLINATION="-832;60;"/>
<linktarget COLOR="#fe512a" DESTINATION="ID_1353514662" ENDARROW="Default" ENDINCLINATION="1101;-48;" ID="Arrow_ID_147584569" SOURCE="ID_1631533844" STARTARROW="None" STARTINCLINATION="-832;60;"/>
<icon BUILTIN="bell"/>
</node>
</node>
@ -97212,8 +97476,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Folgesch&#228;den eines redundanten Aufrufs zu bedenken
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node CREATED="1720574923303" ID="ID_284878377" MODIFIED="1720574930985" TEXT="Design und Code-Qualit&#xe4;t">