Invocation: develop a plan how to integrate a Parameter functor
This is one remaining tricky detail to be solved. The underlying difficulty is architectural: - the processing functor will be supplied by the Media-Lib-Plug-in - while a functor to set parameters and automation will be added from another context Yet both have to work together, and both together will determine the effective type of the ''Weaving Pattern'' Thus we'll have to get both functors somehow integrated into the Level-2-Builder, yet we must be able first to pass this builder instance to the Library-Plug-in and then, in a second step, another part of the Lumiera Builder logic will have to add the Parameter wiring. The solution I'm proposing is to exploit the observation that in fact the processing functor is stored as a kind of »Prototype« within the ''Weaving Pattern'' and will be ''copied'' from there for each individual Render Node invocation. The reasons for this is, we want the optimiser to see the full instantiation of the library function and thus get maximum leverage; thus the code doing the actual call must see the functor or lambda to be able to inline it. This leads to the idea to ''separate'' this »prototype« from the `FeedManifold`; the latter thereby becomes mostly agnostic of parameter processing. However, `FeedManifold` must then accept a copy of the parameter values as constructor argument and pass it into its internal storage. This forces yet another reorganisation of the class structure. Basically the storage modules for `FeedManifold` are now prepared within a configuratiton class, which actually helps to simplify the metaprogramming definitions and keeps the enclosing namespace clean.
This commit is contained in:
parent
488793174f
commit
3a3b7e4dd7
4 changed files with 436 additions and 141 deletions
|
|
@ -107,6 +107,7 @@ namespace engine {
|
|||
|
||||
using lib::meta::_Fun;
|
||||
using lib::meta::enable_if;
|
||||
using lib::meta::disable_if_self;
|
||||
using lib::meta::is_UnaryFun;
|
||||
using lib::meta::is_BinaryFun;
|
||||
using lib::meta::is_TernaryFun;
|
||||
|
|
@ -240,56 +241,100 @@ namespace engine {
|
|||
using BuffO = typename ArgO::List::Head;
|
||||
using BuffI = typename std::conditional<hasInput(), typename ArgI::List::Head, BuffO>::type; /////////////////////////TODO obsolete ... remove after switch
|
||||
};
|
||||
|
||||
|
||||
|
||||
/** FeedManifold building block: hold parameter data */
|
||||
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>
|
||||
using NotProvided = Tagged<lib::meta::NullType, X>;
|
||||
|
||||
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>>
|
||||
struct _StorageSetup
|
||||
{
|
||||
using _Trait = _ProcFun<FUN>;
|
||||
enum{ FAN_I = _Trait::FAN_I
|
||||
, FAN_O = _Trait::FAN_O
|
||||
};
|
||||
|
||||
static constexpr bool hasInput() { return _Trait::hasInput(); }
|
||||
static constexpr bool hasParam() { return _Trait::hasParam(); }
|
||||
|
||||
using ParSig = typename _Trait::SigP;
|
||||
|
||||
template<size_t fan>
|
||||
using BuffS = lib::UninitialisedStorage<BuffHandle, fan>;
|
||||
|
||||
using BuffI = BuffS<FAN_I>;
|
||||
using BuffO = BuffS<FAN_O>;
|
||||
|
||||
using ArgI = typename _Trait::SigI;
|
||||
using ArgO = typename _Trait::SigO;
|
||||
|
||||
|
||||
/** FeedManifold building block: hold parameter data */
|
||||
struct ParamStorage
|
||||
{
|
||||
ParSig param;
|
||||
|
||||
ParamStorage() = default;
|
||||
|
||||
template<typename...INIT>
|
||||
ParamStorage (INIT&& ...paramInit)
|
||||
: param{forward<INIT> (paramInit)...}
|
||||
{ }
|
||||
};
|
||||
|
||||
struct BufferSlot_Input
|
||||
{
|
||||
BuffI inBuff;
|
||||
ArgI inArgs{};
|
||||
};
|
||||
|
||||
struct BufferSlot_Output
|
||||
{
|
||||
BuffO outBuff;
|
||||
ArgO outArgs{};
|
||||
};
|
||||
|
||||
template<typename F>
|
||||
using enable_if_hasParam = typename lib::meta::enable_if_c<_ProcFun<std::decay_t<F>>::hasParam()>::Type;
|
||||
|
||||
template<class X>
|
||||
using NotProvided = Tagged<lib::meta::NullType, X>;
|
||||
|
||||
template<bool yes, class B>
|
||||
using Provide_if = std::conditional_t<yes, B, NotProvided<B>>;
|
||||
|
||||
using FeedOutput = BufferSlot_Output;
|
||||
using FeedInput = Provide_if<hasInput(), BufferSlot_Input>;
|
||||
using FeedParam = Provide_if<hasParam(), ParamStorage>;
|
||||
|
||||
/**
|
||||
* Data Storage block for the FeedManifold
|
||||
* Flexibly configured based on the processing function.
|
||||
*/
|
||||
struct Storage
|
||||
: util::NonCopyable
|
||||
, FeedOutput
|
||||
, FeedInput
|
||||
, FeedParam
|
||||
{
|
||||
FUN process;
|
||||
|
||||
template<typename F>
|
||||
Storage (F&& fun)
|
||||
: process{forward<F> (fun)}
|
||||
{ }
|
||||
|
||||
template<typename F, typename...INIT, typename =disable_if_self<Storage,F>
|
||||
, typename =enable_if_hasParam<F>>
|
||||
Storage (F&& fun, INIT&& ...paramInit)
|
||||
: FeedParam{forward<INIT> (paramInit)...}
|
||||
, process{forward<F> (fun)}
|
||||
{ }
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Adapter to connect input/output buffers to a processing functor backed by an external library.
|
||||
* Essentially, this is structured storage tailored specifically to a given functor signature.
|
||||
|
|
@ -314,27 +359,23 @@ namespace engine {
|
|||
|
||||
template<class FUN>
|
||||
struct FeedManifold
|
||||
: FeedManifold_StorageSetup<FUN>
|
||||
: _StorageSetup<FUN>::Storage
|
||||
{
|
||||
using _Trait = _ProcFun<FUN>;
|
||||
using _F = FeedManifold;
|
||||
using _S = _StorageSetup<FUN>;
|
||||
using _F = typename _S::Storage;
|
||||
|
||||
static constexpr bool hasInput() { return _Trait::hasInput(); }
|
||||
static constexpr bool hasParam() { return _Trait::hasParam(); }
|
||||
/** pass-through constructor */
|
||||
using _S::Storage::Storage;
|
||||
|
||||
using ArgI = typename _Trait::SigI;
|
||||
using ArgO = typename _Trait::SigO;
|
||||
enum{ FAN_I = _Trait::FAN_I
|
||||
, FAN_O = _Trait::FAN_O
|
||||
using ArgI = typename _S::ArgI;
|
||||
using ArgO = typename _S::ArgO;
|
||||
enum{ FAN_I = _S::FAN_I
|
||||
, FAN_O = _S::FAN_O
|
||||
};
|
||||
|
||||
static constexpr bool hasInput() { return _S::hasInput(); }
|
||||
static constexpr bool hasParam() { return _S::hasParam(); }
|
||||
|
||||
FUN process;
|
||||
|
||||
template<typename...INIT>
|
||||
FeedManifold (INIT&& ...funSetup)
|
||||
: process{forward<INIT> (funSetup)...}
|
||||
{ }
|
||||
|
||||
template<size_t i, class ARG>
|
||||
auto&
|
||||
|
|
@ -375,14 +416,34 @@ namespace engine {
|
|||
invoke()
|
||||
{
|
||||
if constexpr (hasInput())
|
||||
process (_F::inArgs, _F::outArgs);
|
||||
_F::process (_F::inArgs, _F::outArgs);
|
||||
else
|
||||
process (_F::outArgs);
|
||||
_F::process (_F::outArgs);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Builder-Prototype to create FeedManifold instances.
|
||||
* This »Prototype« becomes part of the Turnout / WeavingPattern
|
||||
* and holds processing- and parameter-functor instances as configuration.
|
||||
* The Processing-Functor will be copied into the actual FeedManifold instance
|
||||
* for each Node invocation.
|
||||
* @tparam FUN type of the data processing-functor
|
||||
* @tparam PAM type of an optional parameter-setup functor
|
||||
*/
|
||||
template<class FUN, class PAM>
|
||||
class FeedPrototype
|
||||
: util::MoveOnly
|
||||
{
|
||||
FUN procFun_;
|
||||
PAM paramFun_;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1386 : elaborate setup / binding for parameter-creation
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Adapter to handle a simple yet common setup for media processing
|
||||
* - somehow we can invoke processing as a simple function
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@
|
|||
#include "steam/engine/buffhandle-attach.hpp" /////////////////OOO why do we need to include this? we need the accessAs<TY>() template function
|
||||
#include "lib/test/test-helper.hpp" ////////////////////////////OOO TODO added for test
|
||||
#include "lib/format-string.hpp"
|
||||
#include "lib/iter-zip.hpp"
|
||||
//#include "lib/util-foreach.hpp"
|
||||
//#include "lib/iter-adapter.hpp"
|
||||
//#include "lib/meta/function.hpp"
|
||||
|
|
@ -125,6 +126,7 @@ namespace engine {
|
|||
// using lib::Literal;
|
||||
using lib::Several;
|
||||
using lib::Depend;
|
||||
using lib::izip;
|
||||
using util::_Fmt;
|
||||
using util::max;
|
||||
|
||||
|
|
@ -238,7 +240,6 @@ namespace engine {
|
|||
* actual NodeBuilder and PortBuilder allows to introduce extension points
|
||||
* and helps to abstract away internal technical details of the invocation.
|
||||
* @tparam POL allocation and context configuration policy
|
||||
* @tparam N maximum number of input and output slots
|
||||
* @tparam FUN function or invocation adapter to invoke
|
||||
*/
|
||||
template<class POL, class FUN>
|
||||
|
|
@ -346,10 +347,10 @@ namespace engine {
|
|||
REQUIRE (providers.size() == buffTypes.size());
|
||||
auto outTypes = DataBuilder<POL, BuffDescr>{leadPorts.policyConnect()}
|
||||
.reserve (buffTypes.size());
|
||||
uint i=0;
|
||||
for (auto& typeConstructor : buffTypes)
|
||||
|
||||
for (auto& [i,typeConstructor] : izip(buffTypes))
|
||||
outTypes.append (
|
||||
typeConstructor (providers[i++]));
|
||||
typeConstructor (providers[i]));
|
||||
|
||||
ENSURE (leadPorts.size() == FunSpec::FAN_I);
|
||||
ENSURE (outTypes.size() == FunSpec::FAN_O);
|
||||
|
|
|
|||
|
|
@ -79,21 +79,13 @@ namespace test {
|
|||
void
|
||||
verify_FeedManifold()
|
||||
{
|
||||
// some random numbers to test...
|
||||
// Prepare setup to build a suitable FeedManifold...
|
||||
long r1 = rani(100);
|
||||
|
||||
// Prepare setup to build a suitable FeedManifold
|
||||
using Buffer = long;
|
||||
/////////////////////////////////////////////////////////////////////////////////TODO
|
||||
using T1 = tuple<int,double>;
|
||||
using T2 = array<int*,3>;
|
||||
using T3 = int;
|
||||
using T4 = int*;
|
||||
using T5 = lib::HeteroData<int*,long,double*>;
|
||||
/////////////////////////////////////////////////////////////////////////////////TODO
|
||||
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
|
||||
|
||||
|
||||
// Example-1: a FeedManifold to adapt a simple generator function
|
||||
auto fun_singleOut = [&](Buffer* buff) { *buff = r1; };
|
||||
using M1 = FeedManifold<decltype(fun_singleOut)>;
|
||||
CHECK (not M1::hasInput());
|
||||
CHECK (not M1::hasParam());
|
||||
|
|
@ -188,17 +180,12 @@ namespace test {
|
|||
BuffHandle buffI0 = buff;
|
||||
BuffHandle buffI1 = buffOut;
|
||||
BuffHandle buffI2 = provider.lockBufferFor<Buffer> (-22);
|
||||
SHOW_EXPR(buffI0.accessAs<long>())
|
||||
SHOW_EXPR(buffI1.accessAs<long>())
|
||||
SHOW_EXPR(buffI2.accessAs<long>())
|
||||
CHECK (buffI0.accessAs<long>() == r1 ); // (result from Example-1)
|
||||
CHECK (buffI1.accessAs<long>() == r1+1); // (result from Example-2)
|
||||
CHECK (buffI2.accessAs<long>() == -55 ); ///////////////////////////////////////OOO should be -22
|
||||
// prepare a compound buffer and an extra buffer for output...
|
||||
BuffHandle buffO0 = provider.lockBufferFor<Sequence> (Sequence{-111,-222,-333});
|
||||
BuffHandle buffO1 = provider.lockBufferFor<Buffer> (-33);
|
||||
SHOW_EXPR(util::join(buffO0.accessAs<Sequence>()))
|
||||
SHOW_EXPR(buffO1.accessAs<long>())
|
||||
CHECK ((buffO0.accessAs<Sequence>() == Sequence{-111,-222,-333}));
|
||||
CHECK (buffO1.accessAs<long>() == -55 ); ///////////////////////////////////////OOO should be -33
|
||||
|
||||
|
|
@ -209,20 +196,10 @@ SHOW_EXPR(buffO1.accessAs<long>())
|
|||
m3.outBuff.createAt(0, buffO0);
|
||||
m3.outBuff.createAt(1, buffO1);
|
||||
m3.connect();
|
||||
SHOW_EXPR(m3.inArgs)
|
||||
SHOW_EXPR(m3.outArgs)
|
||||
// Verify data exposed prior to invocation....
|
||||
auto& [ia0,ia1,ia2] = m3.inArgs;
|
||||
auto& [oa0,oa1] = m3.outArgs;
|
||||
auto& [o00,o01,o02] = *oa0;
|
||||
SHOW_EXPR(ia0)
|
||||
SHOW_EXPR(ia1)
|
||||
SHOW_EXPR(ia2)
|
||||
SHOW_EXPR(oa0)
|
||||
SHOW_EXPR(o00)
|
||||
SHOW_EXPR(o01)
|
||||
SHOW_EXPR(o02)
|
||||
SHOW_EXPR(oa1)
|
||||
CHECK (*ia0 == r1 );
|
||||
CHECK (*ia1 == r1+1);
|
||||
CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22
|
||||
|
|
@ -232,14 +209,6 @@ SHOW_EXPR(oa1)
|
|||
CHECK (*oa1 == -55 ); /////////////////////////////////////////////////////OOO should be -33
|
||||
|
||||
m3.invoke();
|
||||
SHOW_EXPR(ia0)
|
||||
SHOW_EXPR(ia1)
|
||||
SHOW_EXPR(ia2)
|
||||
SHOW_EXPR(oa0)
|
||||
SHOW_EXPR(o00)
|
||||
SHOW_EXPR(o01)
|
||||
SHOW_EXPR(o02)
|
||||
SHOW_EXPR(oa1)
|
||||
CHECK (*ia0 == r1 ); // Input buffers unchanged
|
||||
CHECK (*ia1 == r1+1);
|
||||
CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22
|
||||
|
|
|
|||
|
|
@ -82,9 +82,7 @@
|
|||
</node>
|
||||
<node CREATED="1538839170700" ID="ID_172497653" MODIFIED="1582486080773" STYLE="fork">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<b><font color="#288d6e">TODO</font></b>: Infos zusammentragen und dokumentieren
|
||||
|
|
@ -25760,9 +25758,7 @@
|
|||
</node>
|
||||
<node CREATED="1563467848565" ID="ID_1150018491" MODIFIED="1576282358069" TEXT="re-Konstruieren müssen letztlich die TrackPresenter machen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
weil <i>nur sie </i>durch ihren Display-Frame die beiden Kind-Widgets kennen
|
||||
|
|
@ -26446,9 +26442,7 @@
|
|||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#338800" CREATED="1582503867646" ID="ID_1320872157" MODIFIED="1582926877646" TEXT="versuchen, das ViewHook-Konzept dafür nutzbar zu machen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
d.h. der Versuch, die Probleme geschickt wegzuabstrahieren.
|
||||
|
|
@ -27066,9 +27060,7 @@
|
|||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1677282651864" ID="ID_749202376" MODIFIED="1677282788849" TEXT="Applikation ist robust aber verhällt sich teilweise absonderlich">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Das liegt vielleicht auch an der etwas „alten“ Version von ca. 2018.
|
||||
|
|
@ -27894,9 +27886,7 @@
|
|||
</node>
|
||||
<node CREATED="1677451946578" ID="ID_256050915" MODIFIED="1677452020472" TEXT="hierfür wäre eine non-Standard-Konvention notwendig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...um festzulegen, an welcher Stelle in der Hierarchie dieses Styling definiert ist; allerdings machen wir bereits genau dies für die Timeline im Allgemeinen (und zwar genau wegen dem custom-drawing)
|
||||
|
|
@ -29003,9 +28993,7 @@
|
|||
<icon BUILTIN="clanbomber"/>
|
||||
<node CREATED="1557446902070" ID="ID_1511315997" MODIFIED="1557498707229" TEXT="kommt davon, wenn man mehrfach polyvalue::EmptyBase verwendet">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
weil nämlich der Trait, für den optimalen Fall, ebenfalls die EmptyBase verwendet, um den Mix-In zu deaktivieren.
|
||||
|
|
@ -30881,9 +30869,7 @@
|
|||
</node>
|
||||
<node CREATED="1568577545755" ID="ID_752815491" MODIFIED="1568577574366">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
weil dann <i>innerhalb </i>des Canvas alles konsistent ist
|
||||
|
|
@ -31464,9 +31450,7 @@
|
|||
<node CREATED="1562969880923" ID="ID_1675178851" MODIFIED="1562969892966" TEXT="damit einen Gtk::StyleContext konfigurieren">
|
||||
<node COLOR="#338800" CREATED="1562969894183" ID="ID_1066073394" MODIFIED="1563033488691" TEXT="StyleContext per Factory erzeugen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
StyleContext::create()
|
||||
|
|
@ -33078,9 +33062,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1567112357515" FOLDED="true" ID="ID_921918885" MODIFIED="1576282358041" TEXT="man könnte noch einen Margin pro Track einarbeiten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
|
|
@ -34535,9 +34517,7 @@
|
|||
</node>
|
||||
<node CREATED="1661693786231" ID="ID_439776533" MODIFIED="1661693870436" TEXT="vorerst/anfangs zeigt das Clip-Widget einen Content-Platzhalter">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und dieser muß einfach lokal im UI zu realisieren sein, also ein Stock-Icon und ggfs ein Vektorgraphic-Element
|
||||
|
|
@ -35190,9 +35170,7 @@
|
|||
<node CREATED="1612471572242" ID="ID_1034906351" MODIFIED="1612471577173" TEXT="hatte es dort schön versteckt"/>
|
||||
<node CREATED="1612471577749" ID="ID_1723611368" MODIFIED="1612471646979" TEXT="aber anscheinend ist das doch eine API-Funktion">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
es gibt bereits einen <i>Sündenfall,</i> nämlich im RelativeCanvasHook: der muß delegieren, und daher von außen diese Methode aufrufen
|
||||
|
|
@ -35683,9 +35661,7 @@
|
|||
<node CREATED="1477343115357" ID="ID_213954404" MODIFIED="1518487921084" TEXT="Kritik">
|
||||
<node CREATED="1477343120660" ID="ID_1940152250" MODIFIED="1576282358033" TEXT="Multiplizität unklar">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
es sieht so aus, als wäre es "das" WorkspaceWindow
|
||||
|
|
@ -36302,9 +36278,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<ul>
|
||||
<li>
|
||||
|
|
@ -51077,9 +51051,7 @@
|
|||
</node>
|
||||
<node CREATED="1491694174845" ID="ID_344801148" MODIFIED="1576282357975" TEXT="Instanzbildung gehört nicht in das Tangible">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das ist ein grundlegender Beschluß.
|
||||
|
|
@ -91878,8 +91850,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Die Signatur des Parameter-Funktors folgt eigentlich zwansläufig aus der gegebenen Processing-Function: es muß ein TurnoutSystem& akzeptiert und ein Parameter(Tupel) geliefert werden (by-value). Seiteneffekte im TurnoutSystem sind möglich (aber die Ausnahme)
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -92098,6 +92069,63 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1734226511062" ID="ID_1899717504" MODIFIED="1734226537968" TEXT="ProcFunctor (mandatory)"/>
|
||||
<node CREATED="1734226564932" ID="ID_696691756" MODIFIED="1734226570322" TEXT="Constructor (static)"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734582866744" ID="ID_1616386454" MODIFIED="1734583016228" TEXT="nochmal restrukturieren: muß nun Param-Tupel durchreichen">
|
||||
<linktarget COLOR="#c1428c" DESTINATION="ID_1616386454" ENDARROW="Default" ENDINCLINATION="-1351;60;" ID="Arrow_ID_676623897" SOURCE="ID_1465521206" STARTARROW="None" STARTINCLINATION="-527;29;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#5b280f" CREATED="1734583035971" ID="ID_662389818" MODIFIED="1734583156432" TEXT="ich möchte nicht das Param-Tupel nachträglich zuweisen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das wäre die <i>billige Lösung:</i> man erzeugt es einfach immer per Default, und dann macht man im ctor-body in FeedManifold eine conditional und eine Zuweisung. Das ist insofern unsauber, da wir Zuweisbarkeit der Werte im Param-Tupel nicht fordern (sondern nur default-Konstruierbarkeit).
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node CREATED="1734583026544" ID="ID_1494983661" MODIFIED="1734583167914" TEXT="bedeutet: Konstrkutor-Kette und in Basis-Klasse durchreichen"/>
|
||||
<node CREATED="1734583169204" ID="ID_960536834" MODIFIED="1734583185511" TEXT="das ist schwierig ... weil die Basis-Klasse komplex aufgebaut wird"/>
|
||||
<node CREATED="1734583186883" ID="ID_445121292" MODIFIED="1734583380956" TEXT="Idee: eine Basis-Klasse »Storage« in einer Konfigurations-Klasse definieren">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1734583221142" ID="ID_49260434" MODIFIED="1734583235671" TEXT="also _StorageSetup<FUN> als äußerer Container"/>
|
||||
<node CREATED="1734583236900" ID="ID_63905696" MODIFIED="1734583247122" TEXT="da kann dann alles Metaprogramming rein..."/>
|
||||
<node CREATED="1734583248433" ID="ID_1335390107" MODIFIED="1734583325076" TEXT="oh ... sogar viel besser, Namespaces bleiben sauber">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und die neueren Compiler können sich auch nicht beschweren, daß wir anonyme Typen in die Storage binden, und obendrein sind so die ganzen Meta-Definitionen wirklich downstream nicht mehr sichtbar
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1734583328473" ID="ID_1649151484" MODIFIED="1734583342689" TEXT="dann gibt man den Basis-Storage-Modulen explizit Namen"/>
|
||||
<node CREATED="1734583343988" ID="ID_430940225" MODIFIED="1734583360386" TEXT="und definiert dann erst die nested struct Storage"/>
|
||||
<node CREATED="1734583361711" ID="ID_568129151" MODIFIED="1734583372909" TEXT="FeedManifold erbt dann von dieser"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734583395510" ID="ID_1700565848" MODIFIED="1734583633132" TEXT="muß dann einen weiteren Ctor auf dieser Basisklasse conditional sichtbar machen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1734583422523" ID="ID_907955668" MODIFIED="1734583446849" TEXT="puh .... FEHLER FEHLER FEHLER FEHLER">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1734583449376" ID="ID_1289337298" MODIFIED="1734583476552" TEXT="der Compiler prüft Copy-Konstruktoren"/>
|
||||
<node CREATED="1734583477904" ID="ID_1284180385" MODIFIED="1734583585790" TEXT="und triggert dabei die Assertion im Traits-Template">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
er versucht nämlich erst einmal, den getemplateten Ctor mit <i>dem this-type</i> zu instantiieren. Das ist dann hier F = struct Storage selber. In der enable-if-Klausel bilden wir aber _ProcFun<F> — und Storage ist ganz offensichtlich keine Funktion und löst die Assertion aus
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1734583588029" ID="ID_442569333" MODIFIED="1734583600327" TEXT="muß disable_if_self<Storage,F> vorschalten"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1734583606218" ID="ID_1419317245" MODIFIED="1734583618846" TEXT="compiliert wieder und bestehende Tests laufen....">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734226618888" ID="ID_758716189" MODIFIED="1734226624083" TEXT="Operationen">
|
||||
<node CREATED="1734226624933" ID="ID_1270095402" MODIFIED="1734282238319" TEXT="buildFeed(TurnoutSystem&) — statisch"/>
|
||||
<node CREATED="1734226650379" ID="ID_1952959461" MODIFIED="1734226679547" TEXT="connect() — befüllt Aufruf-Struktur"/>
|
||||
|
|
@ -92120,6 +92148,166 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1734282698342" ID="ID_1166367446" MODIFIED="1734283404476" TEXT="Aufgabe: Konstruktor-Parameter hängen von der Konfiguration ab">
|
||||
<linktarget COLOR="#fd0e40" DESTINATION="ID_1166367446" ENDARROW="Default" ENDINCLINATION="-134;6;" ID="Arrow_ID_1369831225" SOURCE="ID_151535815" STARTARROW="None" STARTINCLINATION="-270;14;"/>
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
<node CREATED="1734563583763" ID="ID_512213705" MODIFIED="1734572339231" TEXT="tatsächlicher Nutz-Kontext">
|
||||
<arrowlink COLOR="#5958a8" DESTINATION="ID_692448245" ENDARROW="Default" ENDINCLINATION="-2;-498;" ID="Arrow_ID_1679356815" STARTARROW="None" STARTINCLINATION="-480;46;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1734563636412" ID="ID_1633090372" MODIFIED="1734563661168" TEXT="im WeavingPattern liegt ein Prototyp der FeedManifold"/>
|
||||
<node CREATED="1734563662448" ID="ID_1870739425" MODIFIED="1734563678610" TEXT="Instanzen werden über eine Builder-Funktion erzeugt"/>
|
||||
<node CREATED="1734563680430" ID="ID_1419855223" MODIFIED="1734563697326" TEXT="die Konfiguration der Funktoren geht bereits in diesen Prototyp/Builder mit ein"/>
|
||||
</node>
|
||||
<node CREATED="1734563734735" ID="ID_919421103" MODIFIED="1734572326173" TEXT="Nutz-Muster">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1734563740806" ID="ID_55877940" MODIFIED="1734563744641" TEXT="Test-Setup">
|
||||
<node CREATED="1734563746497" ID="ID_423769874" MODIFIED="1734563756595" TEXT="erzeuge den Typ direkt von der Processing-Function"/>
|
||||
<node CREATED="1734563758051" ID="ID_1385547291" MODIFIED="1734563772102" TEXT="instantiiere per Übergabe des Processing-Funktors"/>
|
||||
</node>
|
||||
<node CREATED="1734563786196" ID="ID_174357445" MODIFIED="1734563791747" TEXT="Einfache Node">
|
||||
<node CREATED="1734563799990" ID="ID_871977907" MODIFIED="1734563836213" TEXT="im Prototyen wurde der Processing-Funktor gespeichert"/>
|
||||
<node CREATED="1734563845192" ID="ID_1992702331" MODIFIED="1734563876039" TEXT="Daten liegen im Port und damit fest in der Render-Node-Storage"/>
|
||||
<node CREATED="1734563901958" ID="ID_556454787" MODIFIED="1734563930868" TEXT="Instantiierung: Builder kopiert Proc-Functor in den ctor der FeedManifold"/>
|
||||
</node>
|
||||
<node CREATED="1734564935899" ID="ID_1063511951" MODIFIED="1734564968427" TEXT="Node mit Parametern">
|
||||
<node CREATED="1734564996507" ID="ID_1354211229" MODIFIED="1734565011772" TEXT="im Prototypen liegt wieder der Processing-Funktor"/>
|
||||
<node CREATED="1734565028486" ID="ID_900644106" MODIFIED="1734565043608" TEXT="zusätzlich liegt dort auch ein Param-Funktor"/>
|
||||
<node CREATED="1734565061765" ID="ID_1265541579" MODIFIED="1734565077412" TEXT="zur Invocation wird der Param-Funktor mit TurnoutSystem& aktiviert"/>
|
||||
<node CREATED="1734565079168" ID="ID_92417275" MODIFIED="1734565091994" TEXT="er erzeugt ein Parameter-Tupel"/>
|
||||
<node CREATED="1734565121204" ID="ID_697118762" MODIFIED="1734565138611" TEXT="dieses wird, zusammen mit der Kopie des Processing-Funktors..."/>
|
||||
<node CREATED="1734565139935" ID="ID_681345521" MODIFIED="1734565517799" TEXT="..in den Konstruktor der FeedManifold gegeben">
|
||||
<arrowlink COLOR="#fdf5ca" DESTINATION="ID_963615663" ENDARROW="Default" ENDINCLINATION="-108;-6;" ID="Arrow_ID_47883929" STARTARROW="None" STARTINCLINATION="-48;3;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734565250264" ID="ID_225480799" MODIFIED="1734572351337" TEXT="Typ-Konfiguration">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734565451406" ID="ID_143803456" MODIFIED="1734565466310">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<i>beide Funktoren</i> müssen in den Typ eingehen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1734565258271" ID="ID_963615663" MODIFIED="1734565519358" TEXT="das Weaving-Pattern ist tatsächlich mit dem Prototyp parametrisiert">
|
||||
<linktarget COLOR="#fdf5ca" DESTINATION="ID_963615663" ENDARROW="Default" ENDINCLINATION="-108;-6;" ID="Arrow_ID_47883929" SOURCE="ID_681345521" STARTARROW="None" STARTINCLINATION="-48;3;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1734565328830" ID="ID_497126203" MODIFIED="1734565337641" TEXT="tatsächlich war das auch jetzt bereits so"/>
|
||||
<node CREATED="1734565339027" ID="ID_944000918" MODIFIED="1734565362098" TEXT="nur implizit — versteckt in einer std::function<Feed()>"/>
|
||||
<node CREATED="1734565543377" ID="ID_329042263" MODIFIED="1734572395249" TEXT="künftig machen wir das nun explizt"/>
|
||||
<node CREATED="1734565562090" ID="ID_369242440" MODIFIED="1734565578512" TEXT="mit der Möglichkeit, weiterhin auf die std::function zurückzufallen"/>
|
||||
<node CREATED="1734565580644" ID="ID_1396473921" MODIFIED="1734566898266" TEXT="die Basis-Signatur ist nämlich komplett durch den Proc-Functor determiniert"/>
|
||||
</node>
|
||||
<node CREATED="1734566919020" ID="ID_1101989286" MODIFIED="1734567011323" TEXT="bisher wurde ein Konfig-Adapter verwendet">
|
||||
<node CREATED="1734566950168" ID="ID_763293873" MODIFIED="1734566960359" TEXT="SimpleDirectInvoke<FUN>"/>
|
||||
<node CREATED="1734566932306" ID="ID_1325175738" MODIFIED="1734566967873" TEXT="dieser verbindet die FeedManifold mit dem Weaving Pattern"/>
|
||||
<node CREATED="1734566979291" ID="ID_1589137455" MODIFIED="1734567000284" TEXT="effektiv übernimmt der die Rolle des »Feed-Prototype«"/>
|
||||
<node CREATED="1734568941352" ID="ID_1598999337" MODIFIED="1734568955234" TEXT="Dieser Typ wird per WeavingBuilder injiziert">
|
||||
<node CREATED="1734568957221" ID="ID_260738975" MODIFIED="1734569007724" TEXT="effektiv ist er ein Typ-Parameter des WeavingBuilders">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
wenngleich auch lediglich indirekt, denn der sichtbare Parameter ist FUN, der Typ der Processing-Function
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1734569012990" ID="ID_1162717655" MODIFIED="1734569034684" TEXT="benötigt wird er allerdings erst im terminalen WeavingBuilder::build()"/>
|
||||
<node CREATED="1734569036235" ID="ID_356055578" MODIFIED="1734569057978" TEXT="eine Quer-Bewegung zu einem anders parametrisierten WeavingBuilder ist denkbar">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734569412759" ID="ID_1648744327" MODIFIED="1734569424726">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
neuer Name: <b>FeedPrototype</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1734569182079" ID="ID_716530363" MODIFIED="1734572949166" TEXT="Konfiguration des Parameter-Funktors ⟹ Anpassung des FeedPrototype">
|
||||
<linktarget COLOR="#7389a1" DESTINATION="ID_716530363" ENDARROW="Default" ENDINCLINATION="203;250;" ID="Arrow_ID_1856006217" SOURCE="ID_1285997694" STARTARROW="None" STARTINCLINATION="611;31;"/>
|
||||
<node CREATED="1734569230712" ID="ID_707360092" MODIFIED="1734572978459" TEXT="die Typisierung der FeedManifold ändert sich nicht">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1734569269794" ID="ID_531521282" MODIFIED="1734569279664" TEXT="FUN bestimmt bereits ob es Parameter geben kann"/>
|
||||
<node CREATED="1734569281457" ID="ID_1722557648" MODIFIED="1734573061103" TEXT="ob diese tatsächlich geliefert werden, entscheidet sich zur Laufzeit">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Wenn es also ein Param-Tupel gibt, entscheidet es sich im Aufruf-Kontext, ob dafür ein Init-Wert geliefert wird. Wenn nicht, dann findet Default-Initialisierung statt. Ganz einfach
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<linktarget COLOR="#d8e6f7" DESTINATION="ID_1722557648" ENDARROW="Default" ENDINCLINATION="-31;231;" ID="Arrow_ID_1230712950" SOURCE="ID_317086869" STARTARROW="None" STARTINCLINATION="584;41;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734569453419" ID="ID_1669995398" MODIFIED="1734569568926" TEXT="FeedPrototype<FUN, PAM> trägt einen zweiten Typ-Parameter mit Default"/>
|
||||
<node CREATED="1734569570274" ID="ID_595899197" MODIFIED="1734569581727" TEXT="dieser Default schaltet die Funktion inaktiv"/>
|
||||
<node CREATED="1734570195885" ID="ID_585558138" MODIFIED="1734570216244" TEXT="Quer-Konfiguration ändert diesen Parameter">
|
||||
<node CREATED="1734570301575" ID="ID_1921770646" MODIFIED="1734570323016" TEXT="der Funktor PAM wird Teil des FeedPrototype"/>
|
||||
<node CREATED="1734570324580" ID="ID_1090355756" MODIFIED="1734570342701" TEXT="⟹ er hat einen Einfluß auf die Größe des Turnout"/>
|
||||
<node CREATED="1734570348593" ID="ID_550976299" MODIFIED="1734570361044" TEXT="man kann hier eine std::function konfigurieren">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1734570400410" ID="ID_1801036136" MODIFIED="1734570504358" TEXT="wichtige Stellschraube bzgl. Template-Bloat">
|
||||
<arrowlink COLOR="#ccf6fe" DESTINATION="ID_362452179" ENDARROW="Default" ENDINCLINATION="394;22;" ID="Arrow_ID_85243891" STARTARROW="None" STARTINCLINATION="531;31;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1734570519650" ID="ID_394458547" MODIFIED="1734570565328" TEXT="sollte transparent durchgereicht werden"/>
|
||||
<node CREATED="1734570547303" ID="ID_1642455577" MODIFIED="1734570561425" TEXT="diese Entscheidung fällt auf Builder-Level-3"/>
|
||||
</node>
|
||||
<node CREATED="1734570789216" ID="ID_1930522792" MODIFIED="1734570828093" TEXT="Änderung statisch oder dynamisch">
|
||||
<node CREATED="1734570830057" ID="ID_1130515747" MODIFIED="1734570840417" TEXT="statisch: Typ-Rebuilder vorsehen"/>
|
||||
<node CREATED="1734570841739" ID="ID_249540590" MODIFIED="1734571090344" TEXT="dynamisch: eine builder-Notation">
|
||||
<arrowlink COLOR="#8664dc" DESTINATION="ID_1598621193" ENDARROW="Default" ENDINCLINATION="146;8;" ID="Arrow_ID_1851715816" STARTARROW="None" STARTINCLINATION="-26;75;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1734570896593" ID="ID_120832684" MODIFIED="1734570960763" TEXT="konstruiert wird der FeedPrototype erst im Turnout">
|
||||
<node CREATED="1734570911997" ID="ID_38791432" MODIFIED="1734570967377" TEXT="das Turnout reicht überschüssige Parameter an den Prototype durch">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1734570969165" ID="ID_141488084" MODIFIED="1734571034489" TEXT="Konstruktor-Varianten">
|
||||
<node CREATED="1734571048323" ID="ID_1598621193" MODIFIED="1734571081585" TEXT="Move-ctor: bestehende Prototyp-Konfig übernehmen">
|
||||
<linktarget COLOR="#8664dc" DESTINATION="ID_1598621193" ENDARROW="Default" ENDINCLINATION="146;8;" ID="Arrow_ID_1851715816" SOURCE="ID_249540590" STARTARROW="None" STARTINCLINATION="-26;75;"/>
|
||||
</node>
|
||||
<node CREATED="1734571114213" ID="ID_43601788" MODIFIED="1734571251260" TEXT="beide Funktoren explizit per Value gegeben"/>
|
||||
<node CREATED="1734571350714" ID="ID_108774551" MODIFIED="1734571363533" TEXT="nur der Proc-Functor explizit per Value gegeben">
|
||||
<node CREATED="1734572263295" ID="ID_1485061295" MODIFIED="1734572273442" TEXT="das entspricht der aktuell implementieren Lösung"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1734572275188" ID="ID_534914797" MODIFIED="1734572295035" TEXT="der Proc-Functor muß dann default-konstruierbar sein">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734572306537" ID="ID_1442022066" MODIFIED="1734572315772" TEXT="Implementierung schrittweise aufbauen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734572424754" ID="ID_1186353623" MODIFIED="1734582798770" TEXT="Typ anlegen mit zwei Funktor-Parametern">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572571310" ID="ID_762884176" MODIFIED="1734572593981" TEXT="Traits-Template für Parmeter-Funktor vorsehen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572439920" ID="ID_955026014" MODIFIED="1734573339521" TEXT="createFeed (TurnoutSystem&) implementieren">
|
||||
<linktarget COLOR="#d35582" DESTINATION="ID_955026014" ENDARROW="Default" ENDINCLINATION="-620;38;" ID="Arrow_ID_278216824" SOURCE="ID_112390056" STARTARROW="None" STARTINCLINATION="1203;53;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572530013" ID="ID_765842112" MODIFIED="1734572593980" TEXT="dynamische quer-Builder hinzufügen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734572553754" ID="ID_155507222" MODIFIED="1734572593980" TEXT="Konstruktor bereitstellen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734196584853" ID="ID_1949228582" MODIFIED="1734283386060" TEXT="Anordnung des Parameters für den Param-Funktor bedenken">
|
||||
|
|
@ -92153,6 +92341,21 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#fd0e40" DESTINATION="ID_1166367446" ENDARROW="Default" ENDINCLINATION="-134;6;" ID="Arrow_ID_1369831225" STARTARROW="None" STARTINCLINATION="-270;14;"/>
|
||||
<node CREATED="1734572764400" ID="ID_317086869" MODIFIED="1734573061103" TEXT="wird komplett von FeedManifold getrennt">
|
||||
<arrowlink COLOR="#d8e6f7" DESTINATION="ID_1722557648" ENDARROW="Default" ENDINCLINATION="-31;231;" ID="Arrow_ID_1230712950" STARTARROW="None" STARTINCLINATION="584;41;"/>
|
||||
</node>
|
||||
<node CREATED="1734572775907" ID="ID_1285997694" MODIFIED="1734572955141">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
⟹ geht in eine <u>Builder-Klasse</u> <font color="#392ebf" face="Monospaced"><b>FeedPrototype</b></font><font color="#8a7979" face="Monospaced"><</font><font color="#ab020a" face="Monospaced">FUN</font><font color="#8a7979" face="Monospaced">,</font><font color="#ba3b76" face="Monospaced">PAM</font><font color="#8a7979" face="Monospaced">></font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#7389a1" DESTINATION="ID_716530363" ENDARROW="Default" ENDINCLINATION="203;250;" ID="Arrow_ID_1856006217" STARTARROW="None" STARTINCLINATION="611;31;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -92508,6 +92711,36 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133400400" ID="ID_1364724277" MODIFIED="1734141875620" TEXT="zusätzlichen Funktor fü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 CREATED="1734562038955" ID="ID_692448245" MODIFIED="1734572339232" TEXT="Aufruf-Situation bedenken">
|
||||
<linktarget COLOR="#5958a8" DESTINATION="ID_692448245" ENDARROW="Default" ENDINCLINATION="-2;-498;" ID="Arrow_ID_1679356815" SOURCE="ID_512213705" STARTARROW="None" STARTINCLINATION="-480;46;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1734562056147" ID="ID_1008097228" MODIFIED="1734562079441">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
in den Turnout wird ein <b>Prototyp</b> der FeedManifold eingebettet
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<node CREATED="1734562117362" ID="ID_462941923" MODIFIED="1734562132362" TEXT="die gebundene Adapter/Processing-Function steckt hier"/>
|
||||
<node CREATED="1734562133675" ID="ID_332757580" MODIFIED="1734562147837" TEXT="das kann auch versteckte Binding-Daten mit beinhalten"/>
|
||||
</node>
|
||||
<node CREATED="1734562080880" ID="ID_206914941" MODIFIED="1734562105499" TEXT="für jede Node-Invocation wird daraus die FeedManifold in den Stack-Frame konstruiert"/>
|
||||
<node CREATED="1734562339836" ID="ID_358292961" MODIFIED="1734562369484" TEXT="ausgelöst wird das aus dem WeavingPattern — aber ohne jedwede Kenntisse zur Konfiguration"/>
|
||||
<node CREATED="1734562402763" ID="ID_393302864" MODIFIED="1734562449071" TEXT="für Tests ist es sinnvoll, FeedManifold direkt zu erzeugen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
das heißt, idealerweise ist dieses ganze komplexe Konfigurations-Thema optional und transparent
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734388801494" ID="ID_1469272212" MODIFIED="1734389073266" TEXT="Hier könnte ein Buffer-Typ-Konstruktor mit eingebunden werden">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node BACKGROUND_COLOR="#e2be92" CREATED="1734388824979" ID="ID_1655919747" MODIFIED="1734389385989" TEXT="dieses Thema tauchte im Design immer wieder auf">
|
||||
|
|
@ -92524,7 +92757,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<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">
|
||||
<node CREATED="1734196346326" ID="ID_362452179" MODIFIED="1734570504358" TEXT="std::function hier kann Template-Bloat reduzieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -92533,6 +92766,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#ccf6fe" DESTINATION="ID_362452179" ENDARROW="Default" ENDINCLINATION="394;22;" ID="Arrow_ID_85243891" SOURCE="ID_1801036136" STARTARROW="None" STARTINCLINATION="531;31;"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1734196763636" ID="ID_1457253482" MODIFIED="1734196896465" TEXT="tatsächliche Wirksamkeit hä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;"/>
|
||||
|
|
@ -92554,6 +92788,32 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573094180" HGAP="-9" ID="ID_276469818" MODIFIED="1734573194733" TEXT="FeedManifold wird davon unabhängig" VSHIFT="18">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1734573105647" ID="ID_1068459719" MODIFIED="1734573366211" TEXT="ist allein durch den ProcessingFunctor bestimmt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573119398" ID="ID_112390056" MODIFIED="1734573353430" TEXT="wird erst zur Laufzeit von einem FeedPrototype(Builder) erzeugt">
|
||||
<arrowlink COLOR="#35a1d3" DESTINATION="ID_1416331336" ENDARROW="Default" ENDINCLINATION="420;24;" ID="Arrow_ID_1552949599" STARTARROW="None" STARTINCLINATION="245;11;"/>
|
||||
<arrowlink COLOR="#d35582" DESTINATION="ID_955026014" ENDARROW="Default" ENDINCLINATION="-620;38;" ID="Arrow_ID_278216824" STARTARROW="None" STARTINCLINATION="1203;53;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node CREATED="1734573135923" ID="ID_1817637241" LINK="#ID_1722557648" MODIFIED="1734573174846">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
bekommt ggfs. ein zusätzliches Parameter-Tupel <i>als ctor-Wert</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1734582923838" ID="ID_1465521206" MODIFIED="1734583016228" TEXT="muß dafür nochmal Definitions-Struktur umkrempeln">
|
||||
<arrowlink COLOR="#c1428c" DESTINATION="ID_1616386454" ENDARROW="Default" ENDINCLINATION="-1351;60;" ID="Arrow_ID_676623897" STARTARROW="None" STARTINCLINATION="-527;29;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
</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 — weg damit">
|
||||
|
|
@ -92572,6 +92832,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<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 BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734573209952" ID="ID_1416331336" MODIFIED="1734573261692" TEXT="FeedPrototype in separatem Testfall abhandeln">
|
||||
<linktarget COLOR="#35a1d3" DESTINATION="ID_1416331336" ENDARROW="Default" ENDINCLINATION="420;24;" ID="Arrow_ID_1552949599" SOURCE="ID_112390056" STARTARROW="None" STARTINCLINATION="245;11;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1734133441531" ID="ID_109108903" MODIFIED="1734133509736" TEXT="Turnout-System mit Storage implementieren">
|
||||
|
|
|
|||
Loading…
Reference in a new issue