Invocation: add flexible scheme for storage based on use case

We have now a roughly complete classification of possible use cases.
The invocation can only produce output, process input to output,
and can optionally also accept parameters.

Moreover, each of these cases can require an arbitrary number of actual arguments.
To support all these drastically different case by a common scheme,
`FeedManifold` now uses a »storage slice« for output, input and parameters,
which can be configured at compile time.

TODO: there is an unresolved bug in the test-helper code for the `DiagnosticHeapBlockProvider`,
which prevents us to embed constructor arguments into a buffer descriptor
This commit is contained in:
Fischlurch 2024-12-16 02:26:26 +01:00
parent a477c5953b
commit 39fee624a9
3 changed files with 229 additions and 55 deletions

View file

@ -58,8 +58,16 @@
** - the trait functions #hasInput() and #hasParam() should be used by downstream code
** to find out if some part of the storage is present and branch accordingly
** @todo 12/2024 figure out how constructor-arguments can be passed flexibly
** @todo staled since 2009, picked up in 2024 in an attempt to finish the node invocation.
** @todo WIP-WIP 2024 rename and re-interpret as a connection system
** @remark in the first draft version of the Render Engine from 2009/2012, there was an entity
** called `BuffTable`, which however provided additional buffer-management functionality.
** This name describes well the basic functionality, which can be hard to see with all
** this additional meta-programming related to the flexible functor signature. When it
** comes to actual invocation, we collect input buffers from predecessor nodes and
** we prepare output buffers, and then we pass both to a processing function.
**
** @todo WIP-WIP 12/2024 now about to introduce support for arbitrary parameters into the
** Render-Engine code, which has been reworked for the »Playback Vertical Slice«.
** We have still to reach the point were the engine becomes operational!!!
** @see NodeBase_test
** @see weaving-pattern-builder.hpp
*/
@ -75,6 +83,7 @@
#include "steam/engine/buffhandle.hpp"
#include "lib/uninitialised-storage.hpp"
#include "lib/meta/function.hpp"
#include "lib/meta/trait.hpp"
#include "lib/meta/typeseq-util.hpp"
//#include "lib/several.hpp"
@ -82,7 +91,7 @@
//#include <array>
////////////////////////////////TICKET #826 will be reworked alltogether
////////////////////////////////TICKET #826 12/2024 the invocation sequence has been reworked and reoriented for integration with the Scheduler
namespace steam {
namespace engine {
@ -206,26 +215,67 @@ namespace engine {
using SigI = _Arg<FUN,_Case<Sig>::SLOT_I>;
using SigO = _Arg<FUN,_Case<Sig>::SLOT_O>;
using SigP = _Arg<FUN, 0>;
using BuffI = typename _ArgTrait<SigI>::Buff;
using BuffO = typename _ArgTrait<SigO>::Buff;
enum{ FAN_I = _ArgTrait<SigI>::SIZ
, FAN_O = _ArgTrait<SigO>::SIZ
, FAN_P = _ArgTrait<SigP>::SIZ
, SLOT_I = _Case<Sig>::SLOT_I
, SLOT_O = _Case<Sig>::SLOT_O
, SLOT_P = 0
, MAXSZ = std::max (uint(FAN_I), uint(FAN_O)) /////////////////////OOO required temporarily until the switch to tuples
};
static constexpr bool hasInput() { return SLOT_I != SLOT_O; }
static constexpr bool hasParam() { return 0 < SLOT_I; }
};
template<class FUN>
struct ParamStorage
{
using ParSig = typename _ProcFun<FUN>::SigP;
ParSig param;
};
template<class FUN>
struct BufferSlot_Input
{
using BuffS = lib::UninitialisedStorage<BuffHandle, _ProcFun<FUN>::FAN_I>;
using ArgSig = typename _ProcFun<FUN>::SigI;
BuffS inBuff;
ArgSig inArgs;
};
template<class FUN>
struct BufferSlot_Output
{
using BuffS = lib::UninitialisedStorage<BuffHandle, _ProcFun<FUN>::FAN_O>;
using ArgSig = typename _ProcFun<FUN>::SigO;
BuffS outBuff;
ArgSig outArgs;
};
template<class X>
struct NotProvided : lib::meta::NullType { };
template<bool yes, class B>
using Provide_if = std::conditional_t<yes, B, NotProvided<B>>;
}//(End)Introspection helpers.
template<class FUN>
struct FeedManifold_StorageSetup
: util::NonCopyable
, BufferSlot_Output<FUN>
, Provide_if<_ProcFun<FUN>::hasInput(), BufferSlot_Input<FUN>>
, Provide_if<_ProcFun<FUN>::hasParam(), ParamStorage<FUN>>
{
};
@ -239,7 +289,7 @@ namespace engine {
* This setup is used by a »weaving pattern« within the invocation of a processing node for the
* purpose of media processing or data calculation.
*
* @todo WIP-WIP-WIP 7/24 now reworking the old design in the light of actual render engine requirements...
* @todo WIP-WIP 12/24 now adding support for arbitrary parameters /////////////////////////////////////TICKET #1386
*/
template<class FUN>
struct FoldManifeed

View file

@ -23,6 +23,8 @@
#include "steam/engine/turnout.hpp"
#include "steam/engine/turnout-system.hpp"
#include "steam/engine/feed-manifold.hpp"
#include "steam/engine/diagnostic-buffer-provider.hpp"
#include "steam/engine/buffhandle-attach.hpp"
//#include "lib/format-cout.hpp"
//#include "lib/util.hpp"
@ -80,6 +82,21 @@ namespace test {
using M1 = FeedManifold<decltype(fun_singleOut)>;
CHECK (not M1::hasInput());
CHECK (not M1::hasParam());
M1 m1{};
CHECK (1 == m1.outBuff.array().size());
CHECK (nullptr == m1.outArgs );
// CHECK (m1.inArgs ); // does not compile because storage field is not provided
// CHECK (m1.param );
BufferProvider& provider = DiagnosticBufferProvider::build();
BuffHandle buff = provider.lockBufferFor<long>(); ////////////////////////////OOO can not pass ctor-args directly here
buff.accessAs<long>() = -55;
CHECK (buff.isValid());
CHECK (buff.accessAs<long>() == -55);
m1.outBuff.createAt (0, buff);
CHECK (m1.outBuff[0].isValid());
CHECK (m1.outBuff[0].accessAs<long>() == -55);
}
};

View file

@ -23948,9 +23948,7 @@
<node CREATED="1611918741213" ID="ID_396002411" MODIFIED="1611918753315" TEXT="indirekte Triggerbedingung">
<node CREATED="1611918756795" ID="ID_1406903463" MODIFIED="1611919419969">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
isnil (<font color="#293bcd">profile_</font>)
@ -24591,9 +24589,7 @@
<icon BUILTIN="hourglass"/>
<node COLOR="#435e98" CREATED="1617470705305" HGAP="40" ID="ID_644438911" MODIFIED="1674161854370" TEXT="Stand: vorl&#xe4;ufige Implementierung" VSHIFT="6">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
erst mal nur mit einem Button, und die Layout-Logik ehr &quot;gesch&#228;tzt&quot; den pr&#228;zise verstanden und umgesetzt. Immerhinn l&#228;uft der DisplayEvaluationPass nun, und auch die Buttons erscheinen an der Stelle, an der ich das erwarten w&#252;rde...
@ -25183,9 +25179,7 @@
<node CREATED="1612025095479" ID="ID_1775295616" MODIFIED="1612025105906" TEXT="der Clip bleibt wo er ist (am falschen Ort)"/>
<node CREATED="1612025106830" ID="ID_1695696156" MODIFIED="1612025160707" TEXT="auch die anderen Layout-Anpassungen erfolgen erst beim n&#xe4;chsten Trigger">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
also z.B: wenn man das TestControl schlie&#223;t, oder auch nur den Fokus an das Lumiera-Hauptfenster gibt
@ -25940,9 +25934,7 @@
<node CREATED="1573425794934" ID="ID_1806364197" MODIFIED="1573425808512" TEXT="man kann zwar indirekt die Kind-Elemente enumerieren"/>
<node CREATED="1573425814356" ID="ID_684750058" MODIFIED="1575133305653" TEXT="und man kann per Container::remove() ein Widget entfernen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
und m&#252;&#223;te es danach explizit manuell l&#246;schen!!
@ -27077,9 +27069,7 @@
<node CREATED="1677238946963" ID="ID_872231218" MODIFIED="1677238966708" TEXT="3D-CAD Software f&#xfc;r Bauteil-Konstruktion">
<node CREATED="1677238982982" ID="ID_778717508" MODIFIED="1677239008236" TEXT="Paradigma: dynamisch-funktional">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
man zeichnet nicht, sondern man stellt eine Liste von Operationen zusammen
@ -28909,9 +28899,7 @@
<icon BUILTIN="info"/>
<node CREATED="1557414397598" ID="ID_1788944843" MODIFIED="1557498707228" TEXT="der std::apply-Mechanismus funktioniert nur direkt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
d.h er funktioniert nur, wenn man das std::get&lt;idx&gt; (tuple) unmittelbar an den jeweiligen Ziel-Parameter bindet
@ -29154,9 +29142,7 @@
<node CREATED="1555807861314" ID="ID_352919826" MODIFIED="1557498707229" TEXT="geht das &#xfc;berhaupt?"/>
<node CREATED="1555807866689" ID="ID_1851833268" MODIFIED="1557498707229" TEXT="w&#xfc;rde vermutlich auf ein Builder-Konstrukt hinauslaufen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...etwas analog zu meinem TreeMutator.
@ -32839,9 +32825,7 @@
</node>
<node CREATED="1564868280687" ID="ID_593595518" MODIFIED="1564871156101" TEXT="es hilft nichts, wenn man den Screen (nochmal) setzt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
und ja, den Screen sollte man generell setzten.<br />Steht auch so in der Doku.
@ -33526,9 +33510,7 @@
</node>
<node CREATED="1582923916162" ID="ID_879903056" MODIFIED="1582923946222">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
daher Policy &#228;ndern: jeder schl&#228;gt den <b>totalen absoluten</b>&#160; Offset drauf
@ -35555,9 +35537,7 @@
<node CREATED="1504200743610" ID="ID_1973994759" MODIFIED="1679362063119" TEXT="&#xdc;bergangsweise....">
<node CREATED="1504200750905" ID="ID_1728645080" MODIFIED="1679359485827" TEXT="gab es noch eine ZombieTimeline">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Zum Abschlu&#223; der GUI-&#220;berarbeitung 3/23 habe ich diese Zombie-Timeline tot gemacht
@ -36847,9 +36827,7 @@
</node>
<node CREATED="1539134224759" ID="ID_766070060" MODIFIED="1576282358024" TEXT="Struktur und Realisierung gemeinsam gepusht">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<ul>
<li>
@ -37544,9 +37522,7 @@
</node>
<node CREATED="1615563869355" ID="ID_411566224" MODIFIED="1615563956504" TEXT="Zeiger verwenden, und keine Registry">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
Registry hat zus&#228;tzlichen Overhead (sowohl Speicher, alsauch Management) und ist nur sinnvoll, wenn eine ID in mehreren Objekten vorkommt, oder die ID aus mehreren Thread-Kontexten ben&#246;tigt wird
@ -37903,9 +37879,7 @@
</node>
<node COLOR="#338800" CREATED="1617471493055" ID="ID_1798821612" MODIFIED="1617568252066" TEXT="Makro in einen zentralen Header verlegen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
habs in error.hpp untergebracht, direkt unter ERROR_LOG_AND_IGNORE
@ -38668,9 +38642,7 @@
</node>
<node CREATED="1619887281662" ID="ID_843790040" MODIFIED="1619887627626" TEXT="Spezial-Konventionen bl&#xe4;hen das API auf">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wenn man nun eine fest-vorbereitete L&#246;sung f&#252;r jeden Fall vorsieht, wird die Schnittstelle bereit, un&#252;bersichtlich und k&#246;nnte im Lauf der Zeit verwuchern. Zudem mu&#223; eine komplexe Konvention errichtet werden, wer wann f&#252;r wen welche Variante aufruft
@ -88539,6 +88511,124 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734310118603" ID="ID_1954508996" MODIFIED="1734310510263" TEXT="Feed-Manifold: Eigenschaften demonstrieren">
<linktarget COLOR="#406cd3" DESTINATION="ID_1954508996" ENDARROW="Default" ENDINCLINATION="-207;13;" ID="Arrow_ID_640616380" SOURCE="ID_1710382999" STARTARROW="None" STARTINCLINATION="-2974;268;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1734310213994" ID="ID_691754137" MODIFIED="1734310241708" TEXT="mehrere Varianten von Funktions-Signaturen vorstellen">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734310245306" ID="ID_1881940952" MODIFIED="1734310329959" TEXT="reiner Output mit einem Buffer">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734310278618" ID="ID_1569263616" MODIFIED="1734310327545" TEXT="Input &#x27fc; Output mit einem Buffer">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734310306689" ID="ID_246862993" MODIFIED="1734310327544" TEXT="Input &#x27fc; Output mit einem Buffer mit einem Parameter">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1734310333302" ID="ID_1944960168" MODIFIED="1734310341752" TEXT="jeweils eine Manifold erstellen"/>
<node CREATED="1734310343475" ID="ID_594704625" MODIFIED="1734310357870" TEXT="mit einem Test-BuffHandle beschicken">
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734310375328" ID="ID_126539331" MODIFIED="1734310384120" TEXT="Test-Setup funktioniert nicht">
<icon BUILTIN="broken-line"/>
<node CREATED="1734310554672" ID="ID_1304749247" MODIFIED="1734310563567" TEXT="der Shortcut BufferProvider::lockBufferFor(args...)"/>
<node CREATED="1734310565998" ID="ID_1313467025" MODIFIED="1734310582156" TEXT="hatte ihn bisher stets ohne konkrete Argumente verwendet">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1734310588763" ID="ID_1230270056" MODIFIED="1734310609188" TEXT="Implementierung erzeugt on-the-fly einen Binder">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734310612849" ID="ID_433175533" MODIFIED="1734310625690" TEXT="Untersuchung">
<icon BUILTIN="forward"/>
<node CREATED="1734310670231" ID="ID_179795775" MODIFIED="1734310853961" STYLE="bubble">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;template&lt;class X, typename...ARGS&gt; </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;inline void </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160; <b>buildIntoBuffer</b>&#160;(void* storageBuffer, ARGS&amp;&amp; ...args) </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;{ </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;new(storageBuffer) X(forward&lt;ARGS&gt; (args)...); </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;} </font>
</p>
<p>
</p>
<p>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;template&lt;class X, typename...ARGS&gt; </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;static TypeHandler </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;create (ARGS&amp;&amp; ...args) </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return TypeHandler ( </font><font color="#9d0404" face="Monospaced" size="2">bind (<b>buildIntoBuffer</b>&lt;X,ARGS...&gt;, </font><font color="#c65900" face="Monospaced" size="2"><b>_1</b></font><font color="#9d0404" face="Monospaced" size="2">, forward&lt;ARGS&gt; (args)...)</font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;, destroyInBuffer&lt;X&gt;); </font>
</p>
<p>
<font face="Monospaced" size="2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</font>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734310629446" ID="ID_509553711" MODIFIED="1734311171944" TEXT="Symtom: der Binder kann nicht in eine std::function gepackt werden">
<icon BUILTIN="info"/>
<node CREATED="1734310920831" ID="ID_1089821263" MODIFIED="1734311025297">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced" size="1">no matching function for call to </font>
</p>
<p>
<font face="Monospaced" size="1">&#160;&#160;std::function&lt;void(void*)&gt;::function(</font><font face="Monospaced" size="1" color="#b90563">std::<b>_Bind</b>&lt;void (*(std::_Placeholder&lt;1&gt;, int))(void*, int&amp;&amp;)&gt;</font><font face="Monospaced" size="1">&amp;)</font>
</p>
</body>
</html>
</richcontent>
</node>
<node CREATED="1734311048512" ID="ID_1681074174" MODIFIED="1734311077645" TEXT="weiter oben im Type-Stack sieht man bereits, da&#xdf; dies der Template-Parameter CTOR ist"/>
<node CREATED="1734311079017" ID="ID_1399777845" MODIFIED="1734311159072">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
<font face="Monospaced" size="2">with </font><font face="Monospaced" size="2" color="#710b0b">CTOR</font><font face="Monospaced" size="2">&#160;= std::_<b>Bind</b>&lt;</font><font face="Monospaced" size="2" color="#420477">void (*(std::_Placeholder&lt;1&gt;, int))(void*, int&amp;&amp;)</font><font face="Monospaced" size="2">&gt;;</font>
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#a502af" DESTINATION="ID_1399777845" ENDARROW="Default" ENDINCLINATION="77;114;" ID="Arrow_ID_1332245965" SOURCE="ID_1282234493" STARTARROW="None" STARTINCLINATION="221;17;"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1734311128476" ID="ID_1282234493" MODIFIED="1734311165943" TEXT="ich vestehe diese Typ-Signatur nicht">
<arrowlink COLOR="#a502af" DESTINATION="ID_1399777845" ENDARROW="Default" ENDINCLINATION="77;114;" ID="Arrow_ID_1332245965" STARTARROW="None" STARTINCLINATION="221;17;"/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
</node>
</node>
</node>
<node CREATED="1734310359146" ID="ID_1656582564" MODIFIED="1734310361422" TEXT="aufrufen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1733525831136" ID="ID_1553180375" MODIFIED="1733527489987" TEXT="NodeBuilder_test">
<icon BUILTIN="flag-yellow"/>
@ -91417,8 +91507,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
vorsicht Falle: Parameter werden oft per Referenz genommen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1734299828371" ID="ID_107221686" MODIFIED="1734299851058" TEXT="diese Einschr&#xe4;nkung setze ich hier explizit">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
@ -91443,8 +91532,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
ich mu&#223; f&#252;r die strukturierten F&#228;lle eine eingene Trait-Spezialisierung anlegen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734299948322" ID="ID_1928109484" MODIFIED="1734299969936" TEXT="verlange auch...">
@ -91463,8 +91551,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1734300037782" ID="ID_1265960300" MODIFIED="1734300045369" TEXT="daf&#xfc;r aber Funktoren"/>
</node>
<node CREATED="1734299605025" ID="ID_822733161" MODIFIED="1734299941744" TEXT="is_Structured">
<linktarget COLOR="#685a75" DESTINATION="ID_822733161" ENDARROW="Default" ENDINCLINATION="15;31;" ID="Arrow_ID_1498083496" SOURCE="ID_300211802" STARTARROW="None" STARTINCLINATION="83;5;"/>
<linktarget COLOR="#a9b4c1" DESTINATION="ID_822733161" ENDARROW="Default" ENDINCLINATION="-14;-32;" ID="Arrow_ID_990958884" SOURCE="ID_109395935" STARTARROW="None" STARTINCLINATION="-92;-2;"/>
<linktarget COLOR="#685a75" DESTINATION="ID_822733161" ENDARROW="Default" ENDINCLINATION="15;31;" ID="Arrow_ID_1498083496" SOURCE="ID_300211802" STARTARROW="None" STARTINCLINATION="83;5;"/>
<node CREATED="1734299688214" ID="ID_1568952693" MODIFIED="1734299696272" TEXT="im C++ selber gibt es daf&#xfc;r noch nichts"/>
<node CREATED="1734299700012" ID="ID_1751899842" MODIFIED="1734299720075" TEXT="man kann &#xfc;ber die konstituierenden Funktionen gehen">
<icon BUILTIN="idea"/>
@ -91489,8 +91577,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Denn der weitere darauf aufbauende Code ist ebenfalls nicht ganz in Ordnung und ben&#246;tigt die Generalisierung, um dann grade gezogen zu werden... und ich f&#252;rchte die Situation, wo mir ein Berg von Template-Code um die Ohren fliegt
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<font NAME="SansSerif" SIZE="10"/>
<icon BUILTIN="smiley-neutral"/>
</node>
@ -91786,7 +91873,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#338800" CREATED="1734286473131" ID="ID_414275228" MODIFIED="1734300473228" TEXT="Prallell-Strukturen f&#xfc;r den &#xdc;bergang schaffen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1734286485714" ID="ID_1348489291" MODIFIED="1734300437327" TEXT="im NodeBase_test versuchsweise instantiieren">
<node COLOR="#338800" CREATED="1734286485714" ID="ID_1348489291" MODIFIED="1734310492434" TEXT="im NodeBase_test versuchsweise instantiieren">
<arrowlink COLOR="#16a2aa" DESTINATION="ID_1710382999" ENDARROW="Default" ENDINCLINATION="539;-32;" ID="Arrow_ID_129574515" STARTARROW="None" STARTINCLINATION="183;11;"/>
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1734286523651" ID="ID_132315841" MODIFIED="1734286531775" TEXT="Fall-Unterscheidungen f&#xfc;r die Storage einf&#xfc;hren"/>
@ -91832,8 +91920,27 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1734309978110" ID="ID_436098074" MODIFIED="1734309987990" TEXT="umgebaute FeedManifold testen...">
<node COLOR="#5b280f" CREATED="1734310000123" ID="ID_1140187367" MODIFIED="1734310088299" TEXT="der alte BuffTable_test ist unpassend &#x2014; weg damit">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
F&#252;r die BuffTable war fr&#252;her jede Menge Funktionalit&#228;t geplant, die inzwischen im BufferProvider realisiert wurde; der alte Test h&#228;ngt seit &gt;10 Jahren bei den Engine-Tests unimplementiert mit rum &#8212; es ist sinnlos, ihn nun umzuwidmen
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133441531" ID="ID_109108903" MODIFIED="1734133509736" TEXT="Turnout-Sytem mit Storage implementieren">
<node CREATED="1734309990069" ID="ID_1710382999" MODIFIED="1734310510263" TEXT="angesiedelt in NodeBase_test">
<arrowlink COLOR="#406cd3" DESTINATION="ID_1954508996" ENDARROW="Default" ENDINCLINATION="-207;13;" ID="Arrow_ID_640616380" STARTARROW="None" STARTINCLINATION="-2974;268;"/>
<linktarget COLOR="#16a2aa" DESTINATION="ID_1710382999" ENDARROW="Default" ENDINCLINATION="539;-32;" ID="Arrow_ID_129574515" SOURCE="ID_1348489291" STARTARROW="None" STARTINCLINATION="183;11;"/>
<icon BUILTIN="info"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133441531" ID="ID_109108903" MODIFIED="1734133509736" TEXT="Turnout-System mit Storage implementieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133474862" ID="ID_1734639141" MODIFIED="1734133509736" TEXT="MediaWeavingPattern intern anpassen">