Invocation: solve passing of the function definition

- the chaining constructor is picked reliably when the
  slicing is done by a direct static_cast

- the function definition can be passed reliably in all cases
  after it has been ''decayed,'' which is done here simply by
  taking it by-value. This is adequate, since the function
  definition must be copied / inlined for each invocation.

With these fixes, the simplest test case now for the first time
**runs through without failure**
This commit is contained in:
Fischlurch 2024-10-22 05:59:00 +02:00
parent df37fec500
commit 554a64e212
6 changed files with 233 additions and 144 deletions

View file

@ -137,26 +137,6 @@ namespace engine {
class PortBuilderRoot;
namespace { // Metaprogramming helper to pick the proper constructor...
using lib::meta::disable_if;
using std::bool_constant;
using std::__and_;
template<typename ...ARGS>
struct ArgMatch : std::false_type { };
// template<class POL, class D, uint siz, typename...XS>
// struct ArgMatch<NodeBuilder<POL,D>&&, SizMark<siz>, XS...> : std::true_type { }; // the chaining-ctor takes a NodeBuilder and a size-mark...
template<typename X, uint siz, typename...XS>
struct ArgMatch<X, SizMark<siz> const&, XS...> : std::true_type { }; // the chaining-ctor takes a NodeBuilder and a size-mark...
/** Metaprogramming: prevent the var-args ctor from shadowing the chaining ctor */
template<typename ...ARGS>
using disable_if_Chain = disable_if<__and_<bool_constant<3 == sizeof...(ARGS)> // do not use this constructor if 3 arguments given
,ArgMatch<ARGS...> // and these match the signature for the chaining-constructor
>>;
}
template<class POL, class DAT = PatternDataAnchor>
@ -171,17 +151,10 @@ namespace engine {
DAT patternData_;
public:
template<typename...INIT>//, typename = disable_if_Chain<INIT...>>
template<typename...INIT>
NodeBuilder (INIT&& ...alloInit)
: leads_{forward<INIT> (alloInit)...}
{
//lib::test::TypeDebugger<lib::meta::TySeq<INIT...>> muggi;
//lib::test::TypeDebugger<disable_if_Chain<INIT...>> muggi;
// if constexpr (ArgMatch<INIT...>())
// static_assert(not sizeof(POL), "YESSS!");
// else
// static_assert(not sizeof(POL), "OH_NO");
}
{ }
template<class BUILD, uint siz, class D0>
NodeBuilder (NodeBuilder<POL,D0>&& pred, SizMark<siz>, BUILD&& entryBuilder)
@ -249,6 +222,7 @@ namespace engine {
template<class POL, class DAT>
class PortBuilderRoot
: protected NodeBuilder<POL,DAT>
@ -264,7 +238,7 @@ namespace engine {
/** setup standard wiring to adapt the given processing function.
* @return a PortBuilder specialised to wrap the given \a FUN */
template<typename FUN>
auto invoke (FUN&& fun);
auto invoke (FUN fun);
/** specify an `InvocationAdapter` to use explicitly. */
template<class ADA, typename...ARGS>
@ -313,10 +287,12 @@ namespace engine {
return move(*this);
}
/** define the output slot to use as result
* @remark default is to use the first one */
PortBuilder
asResultSlot (uint r)
{
UNIMPLEMENTED ("define the output slot to use as result (default is the first one)");
weavingBuilder_.selectResultSlot(r);
return move(*this);
}
@ -364,16 +340,10 @@ namespace engine {
{
//////////////////////////////////////////////////////////OOO need to provide all links to lead nodes here
weavingBuilder_.fillRemainingBufferTypes();
using MoThi = decltype(move(*this));
// if constexpr (ArgMatch<MoThi&&, SizMark<5>, void*>())
// static_assert(not sizeof(POL), "YESSS!");
// else
// static_assert(not sizeof(POL), "OH_NO");
// lib::test::TypeDebugger<disable_if_Chain<MoThi&&, int, void*>> buggi;
return NodeBuilder{static_cast<NodeBuilder<POL,DAT>&&> (*this) //move (*this)
return NodeBuilder{static_cast<NodeBuilder<POL,DAT>&&> (*this) // slice away PortBulder subclass data
,weavingBuilder_.sizMark
,weavingBuilder_.build()};
} // chain to builder with extended patternData
} // chain to builder with extended patternData
private:
template<typename FUN>
@ -389,10 +359,10 @@ namespace engine {
template<class POL, class DAT>
template<typename FUN>
auto
PortBuilderRoot<POL,DAT>::invoke (FUN&& fun)
PortBuilderRoot<POL,DAT>::invoke (FUN fun)
{
using WeavingBuilder_FUN = WeavingBuilder<POL, manifoldSiz<FUN>(), FUN>;
return PortBuilder<POL,DAT, WeavingBuilder_FUN>{move(*this), forward<FUN> (fun)};
return PortBuilder<POL,DAT, WeavingBuilder_FUN>{move(*this), move(fun)};
}
/*
template<class POL>

View file

@ -75,16 +75,17 @@ namespace engine {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation
class Port
: util::MoveOnly //////////////////////////////////////////////////OOO not clear if necessary here, and requires us to declare the ctors!!! See Turnout
// : util::MoveOnly //////////////////////////////////////////////////OOO not clear if necessary here, and requires us to declare the ctors!!! See Turnout
: util::NonCopyable //////////////////////////////////////////////////OOO this would be the perfect solution, if we manage to handle this within the builder
{
public:
virtual ~Port(); ///< this is an interface
virtual BuffHandle weave (TurnoutSystem&, OptionalBuff =std::nullopt) =0;
// compiler does not generate a move-ctor automatically due to explicit dtor
Port() = default;
Port(Port&&) = default;
// // compiler does not generate a move-ctor automatically due to explicit dtor
// Port() = default;
// Port(Port&&) = default;
};
using PortRef = std::reference_wrapper<Port>;

View file

@ -279,14 +279,14 @@ namespace engine {
/**
* Standard implementation for a _Weaving Pattern_ to connect
* the input and output data feeds (buffers) into a processing function.
* @tparam CONF a configuration / policy base class
* @tparam INVO a configuration / policy base class to _adapt for invocation_
* @note assumptions made regarding the overall structure
* - `CONF::Feed` defines an _invocation adapter_ for the processing function
* - `CONF::buildFeed()` is a functor to (repeatedly) build `Feed` instances
* - `INVO::Feed` defines an _invocation adapter_ for the processing function
* - `INVO::buildFeed()` is a functor to (repeatedly) build `Feed` instances
* - the _invocation adapter_ in turn embeds a `FeedManifold<N>` to hold
* + an array of input buffer pointers
* + an array of output buffer pointers
* + `CONF::MAX_SIZ` limits both arrays
* + `INVO::MAX_SIZ` limits both arrays
*/
template<class INVO>
struct SimpleWeavingPattern
@ -386,10 +386,10 @@ namespace engine {
using PAT::PAT;
public:
Turnout(Turnout&& rr) ////////////////////////////////////////////OOO investigation of MoveOnly and problems with the builder logic
: Port(static_cast<Port&&>(rr))
, PAT(static_cast<PAT&&>(rr))
{ }
// Turnout(Turnout&& rr) ////////////////////////////////////////////OOO investigation of MoveOnly and problems with the builder logic
// : Port(static_cast<Port&&>(rr))
// , PAT(static_cast<PAT&&>(rr))
// { }
/**
* Entrance point to the next recursive step of media processing.

View file

@ -23,12 +23,74 @@
/** @file weaving-pattern-builder.hpp
** Construction kit to establish an invocation scheme for media calculations.
** Adapters and configuration is provided to invoke the actual _media processing function_
** in accordance to a fixed _wiring scheme:_
** - the function takes two arguments
** - these are an array of input and output buffer pointers
** - buffer sizes or types are assumed to be uniform over all »slots«
** - yet the input side my use another type than the output side
** @todo as of 10/2024, this scheme is established as prototype to explore how processing nodes
** can be build, connected and invoked; the expectation is however that this simple scheme
** is suitable to adapt and handle many common cases of invoking media processing functions,
** because the given _functor_ is constructed within a plug-in tailored to a specific
** media processing library (e.g. FFmpeg) and thus can be a lambda to forward to the
** actual function.
** @note steam::engine::Turnout mixes-in the steam::engine::SimpleWeavingPattern, which in turn
** inherits from an *Invocation Adapter* given as template parameter. So this constitutes
** an *extension point* where other, more elaborate invocation schemes could be integrated.
**
** # Interplay of NodeBuider, PortBuilder and WeavingBuilder
**
** The steam::engine::WeavingBuilder defined here serves as the low-level builder and adapter to
** prepare the wiring and invocation. The builder-API allows to setup the wiring of input and
** output-»slots« and control some detail aspects like caching. However, without defining any
** connections explicitly, a simple 1:1 wiring scheme is employed
** - each _input slot_ of the function gets an input buffer, which is filled by _pulling_
** (i.e. invoking) a predecessor node (a so called »lead«).
** - for each _output slot_ a buffer is allocated for the processing function to drop off
** the calculated media data
** - only one of these output buffers is used as actual result, while the other buffers
** are just discarded (but may possibly be fed to the frame cache).
**
** Each [Processing Node](\ref ProcNode) represents one specific processing functionality on
** a logical level; yet such a node may be able to generate several flavours of this processing,
** which are represented as *ports* on this node. Actually, each such port stands for one specific
** setup of a function invocation, with appropriate _wiring_ of input and output connections.
** For example, an audio filtering function may be exposed on port-#1 for stereo sound, while
** port-#2 may process the left, and port-#3 the right channel in isolation. It is entirely
** up to the library-adapter-plug-in what processing functions to expose, and in which flavours.
** The WeavingBuilder is used to generate a single \ref Turnout object, which corresponds to
** the invocation of a single port and thus one flavour of processing.
**
** On the architectural level above, the \ref NodeBuilder exposes the ability to set up a
** ProcNode, complete with several ports and connected to possibly several predecessor nodes.
** Using several NodeBuilder invocations, the _processing node graph_ can be built up starting
** from the source (predecessors) and moving up to the _exit nodes,_ which produce the desired
** calculation results. The NodeBuilder offers a function to define the predecessor nodes
** (also designated as _lead nodes_), and it offers an entrance point to descend into a
** PortBuilder, allowing to add the port definitions for this node step by step.
**
** On the implementation level, the PortBuilder inherits from the NodeBuilder and embeds a
** WeavingBuilder instance. Moreover, the actual parametrisations of the NodeBuilder template
** are chained to create a _functional data structure._ This intricate setup is necessary because
** the actual data structure of the node graph comprises several small descriptor arrays and
** interconnected pointers, which are all placed into consecutive chunks of memory, using a
** custom allocator, the AllocationCluster. The lib::Several is used as front-end to access
** these small collections of related objects, and the associated lib::SeveralBuilder provides
** the low-level memory allocation and object creation functionality. The purpose of this
** admittedly quite elaborate scheme is to generate a compact data structure, with high
** cache locality and without wasting too much memory. Since the exact number of elements
** and the size of those elements can be concluded only after the builder-API usage has
** been completed, the aforementioned functional datastructure is used to collect the
** parametrisation information for all ports, while delaying the actual object creation.
** With this technique, it is possible to generate all descriptors or entries of one
** kind in a single run, and placed optimally and compact into the memory allocation.
**
** @see turnout.hpp
** @see node-builder.hpp
** @see NodeLinkage_test
**
** @todo WIP-WIP-WIP as of 7/2024 prototyping how to build and invoke render nodes /////////////////////////TICKET #1367
** @todo WIP-WIP-WIP as of 10/2024 prototyping how to build and invoke render nodes /////////////////////////TICKET #1371
**
*/
@ -191,11 +253,14 @@ namespace engine {
};
/**
* Example base configuration for a Weaving-Pattern chain:
* Typical base configuration for a Weaving-Pattern chain:
* - use a simple processing function
* - pass an input/output buffer array to this function
* - map all »slots« directly without any re-ordering
* - use a sufficiently sized FeedManifold as storage scheme
* @remark actual media handling plug-ins may choose to
* employ more elaborate _invocation adapters_
* specifically tailored to the library's needs.
*/
template<uint N, class FUN>
struct DirectFunctionInvocation
@ -207,14 +272,13 @@ namespace engine {
std::function<Feed()> buildFeed;
// template<typename INIT>
/** when building the Turnout, prepare the _invocation adapter_
* @note processing function \a fun is bound by value into the closure,
* so that each invocation will create a copy of that function,
* embedded (and typically inlined) into the invocation adapter.
*/
DirectFunctionInvocation(FUN fun)
: buildFeed{[=]//procFun = forward<INIT> (fun)]
{
// using URGS = decltype(procFun);
// lib::test::TypeDebugger<URGS> murks;
return Feed{fun};
}}
: buildFeed{[=]{ return Feed{fun}; }}
{ }
};
@ -275,9 +339,12 @@ namespace engine {
};
template<uint N, class FUN>
using SimpleDirectInvoke = SimpleWeavingPattern<DirectFunctionInvocation<N,FUN>>;
template<class POL, uint N, class FUN>
struct WeavingBuilder
: util::MoveOnly
@ -307,7 +374,7 @@ namespace engine {
{
PortRef portRef; /////////////////////////////////////OOO TODO need Accessor on ProcNode!!!!!
leadPort.append (portRef);
ENSURE (leadPort.size() < N);
ENSURE (leadPort.size() <= N);
return move(*this);
}
@ -318,7 +385,7 @@ namespace engine {
while (cnt--)
buffTypes.emplace_back([](BufferProvider& provider)
{ return provider.getDescriptor<BU>(); });
ENSURE (buffTypes.size() < N);
ENSURE (buffTypes.size() <= N);
return move(*this);
}
@ -367,7 +434,6 @@ namespace engine {
]
(PortDataBuilder& portData) mutable -> void
{
//lib::test::TypeDebugger<decltype(procFun)> uggi;
portData.template emplace<TurnoutWeaving> (move(leads)
,move(types)
,resultIdx

View file

@ -73,7 +73,7 @@ namespace test {
{
auto con = prepareNode()
.preparePort()
.invoke(&dummyOp)
.invoke(dummyOp)
.completePort()
.build();
CHECK (isnil (con.leads));

View file

@ -8842,9 +8842,7 @@
<node CREATED="1511482446317" ID="ID_951810826" MODIFIED="1511482457247" TEXT="entweder der Typ der Funktion ist bestimmbar"/>
<node CREATED="1511482457978" ID="ID_564239157" MODIFIED="1511482493455">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
oder man f&#228;llt auf <i>eine</i>&#160;m&#246;gliche Substitution zur&#252;ck
@ -9521,9 +9519,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
unter der Annahme, da&#223; wir beim <b>Lumiera Forward Iterator</b>&#160;- Konzept bleiben
@ -11921,9 +11917,7 @@
<node CREATED="1514746268280" FOLDED="true" ID="ID_1650861625" MODIFIED="1561827469152" TEXT="totale Coverage ist einfach">
<node CREATED="1514746278542" ID="ID_638094416" MODIFIED="1514746296223">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
L&#246;sungen m&#252;ssen
@ -15807,9 +15801,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504885554399" ID="ID_1868485493" MODIFIED="1561827465183">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<i>Allokator</i>&#160;pro Typ
@ -19816,9 +19808,7 @@
<node CREATED="1664059679707" ID="ID_1826707626" MODIFIED="1664059710722" TEXT="Name-ID gen&#xfc;gt &#x27f9; Zugang zum konkreten Medium via Steam"/>
<node CREATED="1664059758792" ID="ID_665980098" MODIFIED="1664059964811" TEXT="[nur tempor&#xe4;r] laufende Renderer-Instanz">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
analog wie ein Player; w&#228;hrend das Content-Rendering l&#228;uft mu&#223; der Clip eine Registrierung in einem zust&#228;ndigen OutputManager aufrechterhalten, um die berechneten Pixmaps dann entgegenzunehmen
@ -19828,9 +19818,7 @@
</node>
<node CREATED="1664059979870" ID="ID_1021249462" MODIFIED="1664060176885" TEXT="Information zu den vorhandenen Pixmaps, sowie deren Bedeutung">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wir speichern ganz sicher nicht ein Mini-Bild f&#252;r jeden Frame eines Video, sondern brauchen hier wohl eine Art lokales Caching; das hei&#223;t, die Pixmaps f&#252;r einen aktiven Bereich plus eine gewisse Umgebung sind direkt greifbar im GUI. Dieses Caching ist aber nur ein 1st-Level, denn wir wollen den (als sehr elaboriert konzipierten) globalen Frame-Cache auch f&#252;r diesen Zweck mitbenutzen; schlie&#223;lich d&#252;rften diese Vorschaubilder die h&#228;ufigsten laufenden Rendervorg&#228;nge sein...
@ -50598,9 +50586,7 @@
</node>
<node CREATED="1488676179840" ID="ID_1207866065" MODIFIED="1518487921091">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
mehrere k&#246;nnten f&#252;r
@ -50613,9 +50599,7 @@
<node CREATED="1488676238120" ID="ID_62079120" MODIFIED="1518487921091" TEXT="da an ein Control/Interface-System gebunden"/>
<node CREATED="1488676280459" ID="ID_800780235" MODIFIED="1576282358001" TEXT="ist vermutlich keine gute Idee">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
....denn wir wollen ja grade
@ -50654,9 +50638,7 @@
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und zwar zwingend, sobald
@ -50687,9 +50669,7 @@
</node>
<node CREATED="1488674815867" ID="ID_417989611" MODIFIED="1576282357999" TEXT="eigentlich nicht">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...vom Linken her nicht, da wir Gui gegen Proc linken
@ -50789,9 +50769,7 @@
</node>
<node CREATED="1488676941240" ID="ID_403164604" MODIFIED="1576282357998" TEXT="im Proc-Dispatcher kein Problem">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...da die DispatcherQueue direkt Command-Objekte (=frontend handle) speichert
@ -89618,8 +89596,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1728918043717" ID="ID_828413139" MODIFIED="1728918052586" TEXT="Konzeptionelles Problem mit Port im Builder">
<icon BUILTIN="broken-line"/>
<node CREATED="1728918063615" ID="ID_1224903798" MODIFIED="1728918076172" TEXT="Konflikt in mehrerlei Hinsichten">
<node CREATED="1728918082390" ID="ID_200366040" MODIFIED="1728918186876" TEXT="Architektonisch betrachtet sollten alle Entit&#xe4;ten non-Copyable sein"/>
<node COLOR="#3a0830" CREATED="1728918063615" ID="ID_1224903798" MODIFIED="1729562503204" TEXT="&#xd83d;&#xddf2; Konflikt in mehrerlei Hinsicht">
<font NAME="SansSerif" SIZE="12"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1728918082390" ID="ID_200366040" MODIFIED="1729562524196" TEXT="architektonisch betrachtet sollten alle Entit&#xe4;ten non-Copyable sein">
<icon BUILTIN="yes"/>
<node CREATED="1729562526605" ID="ID_1731450489" MODIFIED="1729562540592" TEXT="erschien mir zun&#xe4;chst unm&#xf6;glich"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#690f14" CREATED="1729562541540" ID="ID_122993656" LINK="#ID_578956741" MODIFIED="1729562593469" TEXT="hab&apos;s dann aber durch trickreiches Umordnen im Builder so hinbekommen">
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node CREATED="1728918225779" ID="ID_425950473" MODIFIED="1728918242221" TEXT="das steht im Widerspruch zum &#xfc;blichen Builder-Definitionsschema">
<node CREATED="1728918596625" ID="ID_937405626" MODIFIED="1728918624201" TEXT="insofern ein Builder ein Resultat zur&#xfc;ckliefert"/>
<node CREATED="1728918625957" ID="ID_709289044" MODIFIED="1728918781196" TEXT="Klassen aus Member/Parent aufbauen (keine Referenz)"/>
@ -89640,7 +89625,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1728918387245" ID="ID_188010599" MODIFIED="1728918420109" TEXT="au&#xdf;erdem: lib::SeveralBuilder braucht nothrow-Movable f&#xfc;r ein realloc()"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728918432543" ID="ID_1719167814" MODIFIED="1728921685603" TEXT="und konkret verh&#xe4;lt sich der Compiler &#xfc;berraschend (Copy-Konstruktor)">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728918432543" ID="ID_1719167814" MODIFIED="1728922210152" TEXT="und konkret verh&#xe4;lt sich der Compiler &#xfc;berraschend (Copy-Konstruktor)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -89652,6 +89637,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#fdf8b6" DESTINATION="ID_35677607" ENDARROW="Default" ENDINCLINATION="-503;20;" ID="Arrow_ID_321857672" STARTARROW="None" STARTINCLINATION="14;22;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1728921691001" ID="ID_369047782" MODIFIED="1728921712680" TEXT="er beseht darauf, f&#xfc;r Port den Copy-Konstruktor aufzurufen"/>
<node CREATED="1728921713967" ID="ID_840072193" MODIFIED="1728921744509" TEXT="selbst wenn ich explizit in Turnout einen Move-Konstruktor anschreibe"/>
@ -89660,7 +89646,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1728922025973" ID="ID_680965500" MODIFIED="1728922050645" TEXT="habe ich nach meinem Standard-Schema so gemacht">
<node CREATED="1728922282946" ID="ID_1363255304" MODIFIED="1728922288421" TEXT="ist auch notwendig"/>
<node CREATED="1728922295305" ID="ID_730483507" MODIFIED="1728922364523" TEXT="denn im Template-Code schreibt man typischerweise die virtuellen Methoden inline"/>
<node CREATED="1728922365989" ID="ID_1155260812" MODIFIED="1728922439999" TEXT="und dann emittiert u.U. der Compiler keine VTable (ist tats&#xe4;chlich ein Problem hier">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728922365989" ID="ID_1155260812" MODIFIED="1729561526565" TEXT="und dann emittiert u.U. der Compiler keine VTable (ist tats&#xe4;chlich ein Problem hier)">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -89681,6 +89667,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#fdf8b6" DESTINATION="ID_35677607" ENDARROW="Default" ENDINCLINATION="-503;20;" ID="Arrow_ID_321857672" SOURCE="ID_1719167814" STARTARROW="None" STARTINCLINATION="14;22;"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728922453819" ID="ID_854132229" MODIFIED="1728922545653" TEXT="m&#xfc;&#xdf;te dann explizit diese Konstruktoren deklarieren">
<arrowlink COLOR="#e8ffd5" DESTINATION="ID_1240656293" ENDARROW="Default" ENDINCLINATION="48;-247;" ID="Arrow_ID_383730101" STARTARROW="None" STARTINCLINATION="-552;28;"/>
@ -89689,8 +89676,10 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1728919511214" ID="ID_717691514" MODIFIED="1728919518364" TEXT="L&#xf6;sungs-Strategien">
<node CREATED="1728919519861" ID="ID_893369954" MODIFIED="1728919531258" TEXT="Port tats&#xe4;chlich non-copyable machen">
<node COLOR="#435e98" CREATED="1728919511214" ID="ID_717691514" MODIFIED="1729562426291" TEXT="L&#xf6;sungs-Strategien">
<icon BUILTIN="idea"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1728919519861" ID="ID_893369954" MODIFIED="1729562341054" TEXT="Port tats&#xe4;chlich non-copyable machen">
<icon BUILTIN="forward"/>
<node CREATED="1728919575373" ID="ID_1789193481" MODIFIED="1728919601059" TEXT="dann m&#xfc;&#xdf;te der WeavingBuilder per Seiteneffekt in emplacen">
<icon BUILTIN="idea"/>
<node CREATED="1728919603437" ID="ID_1351297042" MODIFIED="1728919611061" TEXT="das w&#xe4;re definitiv machbar"/>
@ -89720,12 +89709,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1728920206175" ID="ID_1988845099" MODIFIED="1728920273724" TEXT="aber der nested-Builder bewirkt verschachtelte Allokations-Anforderungen"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728920314192" ID="ID_147357026" MODIFIED="1728920324731" TEXT="L&#xf6;sungen">
<node BACKGROUND_COLOR="#d9dfee" COLOR="#435e98" CREATED="1728920314192" ID="ID_147357026" MODIFIED="1729562403193" TEXT="L&#xf6;sungen">
<icon BUILTIN="idea"/>
<node COLOR="#5b280f" CREATED="1728920326985" ID="ID_548153639" MODIFIED="1729477474451" TEXT="ben&#xf6;tigte Anzahl zu Beginn vom Client verbindlich festzusetzen">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1728920344206" ID="ID_337652041" MODIFIED="1729477477113" TEXT="trickreichen Aufruf, der alle Builder in einem Lauf abfeuert">
<node CREATED="1728920344206" ID="ID_337652041" MODIFIED="1729561685531" TEXT="trickreichen Aufruf, der alle Builder in einem Lauf abfeuert">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -89739,12 +89728,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</ul>
</body>
</html></richcontent>
<arrowlink COLOR="#4186c0" DESTINATION="ID_1001603416" ENDARROW="Default" ENDINCLINATION="502;0;" ID="Arrow_ID_1482573808" STARTARROW="None" STARTINCLINATION="421;19;"/>
<icon BUILTIN="forward"/>
</node>
</node>
</node>
</node>
<node CREATED="1728920705824" ID="ID_1896772759" MODIFIED="1728920715408" TEXT="Port wird MoveOnlyNothrow">
<node COLOR="#5b280f" CREATED="1728920705824" ID="ID_1896772759" MODIFIED="1729562331566" TEXT="Port wird MoveOnlyNothrow">
<icon BUILTIN="button_cancel"/>
<node CREATED="1728920716828" ID="ID_1775685257" MODIFIED="1728920798837" TEXT="&#xbb;MoveOnlyNothrow&#xab; w&#xe4;re dann eine neue Variante">
<richcontent TYPE="NOTE"><html>
<head/>
@ -89771,16 +89762,18 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1728921085563" ID="ID_1240656293" MODIFIED="1728922531582" TEXT="Status-quo : nur das PAT ist moveOnly">
<node COLOR="#5b280f" CREATED="1728921085563" ID="ID_1240656293" MODIFIED="1729562334888" TEXT="Status-quo : nur das PAT ist moveOnly">
<linktarget COLOR="#e8ffd5" DESTINATION="ID_1240656293" ENDARROW="Default" ENDINCLINATION="48;-247;" ID="Arrow_ID_383730101" SOURCE="ID_854132229" STARTARROW="None" STARTINCLINATION="-552;28;"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1728921114799" ID="ID_8142965" MODIFIED="1728921127761" TEXT="auch hier m&#xfc;&#xdf;te man letztlich ein MoveOnlyNothrow einf&#xfc;hren"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1728921157089" ID="ID_1600081549" MODIFIED="1728921342782" TEXT="und der Several-Builder mu&#xdf; das wissen">
<node BACKGROUND_COLOR="#f1e5a6" COLOR="#a50125" CREATED="1728921157089" ID="ID_1600081549" MODIFIED="1729562837190" TEXT="und der Several-Builder mu&#xdf; das wissen">
<arrowlink COLOR="#eb115c" DESTINATION="ID_690402795" ENDARROW="Default" ENDINCLINATION="11;-7;" ID="Arrow_ID_983406969" STARTARROW="None" STARTINCLINATION="-5;9;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node CREATED="1728921171892" ID="ID_1252631310" MODIFIED="1728921184538" TEXT="Konsistenz-Problem mit dem aktuellen Stand">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#520f69" CREATED="1728921171892" ID="ID_1252631310" MODIFIED="1729562867708" TEXT="Konsistenz-Problem mit dem aktuellen Stand">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1728921193764" ID="ID_690402795" MODIFIED="1728921344029" TEXT="der Several-Builder arbeitet mit I &#x2261; E &#x2254; Port">
<linktarget COLOR="#eb115c" DESTINATION="ID_690402795" ENDARROW="Default" ENDINCLINATION="11;-7;" ID="Arrow_ID_983406969" SOURCE="ID_1600081549" STARTARROW="None" STARTINCLINATION="-5;9;"/>
<icon BUILTIN="broken-line"/>
@ -89898,7 +89891,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729302196298" ID="ID_1847553313" MODIFIED="1729303144999" TEXT="eine pa&#xdf;genaue Allokation ist eigens sicherzustellen">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1729302196298" ID="ID_1847553313" MODIFIED="1729562797498" TEXT="eine pa&#xdf;genaue Allokation ist eigens sicherzustellen">
<arrowlink COLOR="#a33264" DESTINATION="ID_1966477380" ENDARROW="Default" ENDINCLINATION="16;-35;" ID="Arrow_ID_1870774816" STARTARROW="None" STARTINCLINATION="-112;6;"/>
<icon BUILTIN="yes"/>
<node CREATED="1729302235086" ID="ID_1925341713" MODIFIED="1729302359360" TEXT="die Diskussion btr. Non-copyable vs. movable ist peripher">
@ -89926,15 +89919,17 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1729302877288" ID="ID_1127038030" MODIFIED="1729302925317" TEXT="damit scheidet die L&#xf6;sung aus, da&#xdf; der Client die ben&#xf6;tigten Daten &#xbb;vordimensioniert&#xab;">
<icon BUILTIN="closed"/>
</node>
<node CREATED="1729302940255" ID="ID_1001603416" MODIFIED="1729302987650" TEXT="der Build-Vorgang mu&#xdf; kompakt in der terminalen Operation stattfinden">
<node CREATED="1729302940255" ID="ID_1001603416" MODIFIED="1729562224737" TEXT="der Build-Vorgang mu&#xdf; kompakt in der terminalen Operation stattfinden">
<arrowlink COLOR="#3b5a65" DESTINATION="ID_1973963222" ENDARROW="Default" ENDINCLINATION="1150;-31;" ID="Arrow_ID_1910798539" STARTARROW="None" STARTINCLINATION="931;37;"/>
<linktarget COLOR="#4186c0" DESTINATION="ID_1001603416" ENDARROW="Default" ENDINCLINATION="502;0;" ID="Arrow_ID_1482573808" SOURCE="ID_337652041" STARTARROW="None" STARTINCLINATION="421;19;"/>
<icon BUILTIN="forward"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729303081050" ID="ID_1966477380" MODIFIED="1729303127596" TEXT="Ausarbeiten einer pa&#xdf;genauen Implementierung">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729303081050" ID="ID_1966477380" MODIFIED="1729562785747" TEXT="Ausarbeiten einer pa&#xdf;genauen Implementierung">
<linktarget COLOR="#a33264" DESTINATION="ID_1966477380" ENDARROW="Default" ENDINCLINATION="16;-35;" ID="Arrow_ID_1870774816" SOURCE="ID_1847553313" STARTARROW="None" STARTINCLINATION="-112;6;"/>
<icon BUILTIN="flag-pink"/>
<icon BUILTIN="pencil"/>
<node CREATED="1729303163506" ID="ID_1888134179" MODIFIED="1729303172498" TEXT="Zielvorgaben">
<icon BUILTIN="yes"/>
<node CREATED="1729303190542" ID="ID_1157491975" MODIFIED="1729303371888">
@ -89965,7 +89960,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1729303223690" ID="ID_1668152159" MODIFIED="1729303249893" TEXT="vor Belegen des ersten Datenelements mu&#xdf; eine automatische Dimensionierung erfolgen"/>
</node>
<node CREATED="1729305640248" ID="ID_1661765820" MODIFIED="1729305648785" TEXT="Analyse der Einzelvorg&#xe4;nge">
<node COLOR="#435e98" CREATED="1729305640248" ID="ID_1661765820" MODIFIED="1729562776603" TEXT="Analyse der Einzelvorg&#xe4;nge">
<icon BUILTIN="info"/>
<node CREATED="1729305727202" ID="ID_957838756" MODIFIED="1729305731853" TEXT="NodeBuilder">
<node CREATED="1729305733399" ID="ID_1044493689" MODIFIED="1729305839911" TEXT="die LeadRefs sind relativ unproblematisch">
<richcontent TYPE="NOTE"><html>
@ -90039,26 +90035,27 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1729308176710" ID="ID_70235871" MODIFIED="1729308532647" TEXT="Wichtig: am Ende des PortBuilder&apos; bereits eine Type-Erasure machen">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1729308176710" ID="ID_70235871" MODIFIED="1729562733053" TEXT="Wichtig: am Ende des PortBuilder&apos; bereits eine Type-Erasure machen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
denn der konkrete Funktionstyp und das N (&#8793;Manifold-Gr&#246;&#223;e), sowie ggfs. ein alternativer &#187;InvocationAdapter&#171;-Typ sind zun&#228;chst im konkreten Typ des PortBuilders angelegt (als Typ-Kontext); das bedeutet, das Parameter-Tupel mu&#223; aus lauter Wrappern bestehen, die die konkreten Typen bereits materialisiert und virtualisiert enthalten. F&#252;r lib::Several ist das definitiv der Fall (das verweist auf einen Extent, in dem die Metadaten und das Daten-Array liegen). Auch std::function ist eine Abstraktion. Also w&#228;re wohl noch ein weiterer Generator-Functor notwendig, in dem man den konkreten InvocationAdapter versteckt
denn der konkrete Funktionstyp und das N (&#8793;Manifold-Gr&#246;&#223;e), sowie ggfs. ein alternativer &#187;InvocationAdapter&#171;-Typ sind zun&#228;chst im konkreten Typ des PortBuilders angelegt (als Typ-Kontext); das bedeutet, das Parameter-Satz mu&#223; aus lauter Wrappern bestehen, die die konkreten Typen bereits materialisiert und virtualisiert enthalten. F&#252;r lib::Several ist das definitiv der Fall (das verweist auf einen Extent, in dem die Metadaten und das Daten-Array liegen). Auch std::function ist eine Abstraktion. Also w&#228;re wohl noch ein weiterer Generator-Functor notwendig, in dem man den konkreten InvocationAdapter versteckt und damit die genaue Parametrisierung des Turnout versteckt....
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729555599082" HGAP="21" ID="ID_466296328" MODIFIED="1729555917266" TEXT="durch &#x3bb;-closure" VSHIFT="15">
<node COLOR="#435e98" CREATED="1729555599082" HGAP="21" ID="ID_466296328" MODIFIED="1729562624713" TEXT="durch &#x3bb;-closure" VSHIFT="15">
<arrowlink COLOR="#3d37ad" DESTINATION="ID_669795504" ENDARROW="Default" ENDINCLINATION="-187;-368;" ID="Arrow_ID_91190585" STARTARROW="None" STARTINCLINATION="-105;399;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node>
</node>
<node CREATED="1729379380389" ID="ID_1826146255" MODIFIED="1729379767284" TEXT="Feststellen der Aufgabe">
<node COLOR="#435e98" CREATED="1729379380389" ID="ID_1826146255" MODIFIED="1729562768478" TEXT="Feststellen der Aufgabe">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="forward"/>
<node CREATED="1729379393219" ID="ID_162735050" MODIFIED="1729379802830" TEXT="die bestehende Implementierung ist logisch gradlinig">
<node CREATED="1729379393219" ID="ID_162735050" MODIFIED="1729562763866" TEXT="die bestehende Implementierung ist logisch gradlinig">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
@ -90067,21 +90064,22 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1729379408767" ID="ID_1384384815" MODIFIED="1729379780804" TEXT="sie soll (und kann) komplett erhalten bleiben wie sie ist"/>
<node CREATED="1729379433780" ID="ID_26064200" MODIFIED="1729379761461" TEXT="im WeavingBuilder ist nur eine minimale Umordnung der Data-Builder-Aufrufe notwendig">
<node COLOR="#435e98" CREATED="1729379408767" ID="ID_1384384815" MODIFIED="1729562759094" TEXT="sie soll (und kann) komplett erhalten bleiben wie sie ist"/>
<node COLOR="#435e98" CREATED="1729379433780" ID="ID_26064200" MODIFIED="1729562756703" TEXT="im WeavingBuilder ist nur eine minimale Umordnung der Data-Builder-Aufrufe notwendig">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1729379729417" ID="ID_1951268337" MODIFIED="1729379757592" TEXT="zum Abschlu&#xdf; des Build-Vorganges ist lediglich eine Verz&#xf6;gerung per Closure notwendig">
<node COLOR="#435e98" CREATED="1729379729417" ID="ID_1951268337" MODIFIED="1729562754287" TEXT="zum Abschlu&#xdf; des Build-Vorganges ist lediglich eine Verz&#xf6;gerung per Closure notwendig">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729380002560" ID="ID_1790648194" MODIFIED="1729380024816" TEXT="Erasure der Weaving-Pattern-Konfiguration">
<node COLOR="#435e98" CREATED="1729380002560" ID="ID_1790648194" MODIFIED="1729562746017" TEXT="Erasure der Weaving-Pattern-Konfiguration">
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729385699535" ID="ID_1823720040" MODIFIED="1729385709180" TEXT="Umstellung der Implementierung">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729385821879" ID="ID_562398626" MODIFIED="1729477924907" TEXT="neues Interface f&#xfc;r Build-Ergebnis schaffen">
<node COLOR="#435e98" CREATED="1729385821879" ID="ID_562398626" MODIFIED="1729561730249" TEXT="neues Interface f&#xfc;r Build-Ergebnis schaffen">
<icon BUILTIN="yes"/>
<node CREATED="1729385860586" ID="ID_1726006228" MODIFIED="1729385872581" TEXT="Zweck...">
<node CREATED="1729385873337" ID="ID_1712688191" MODIFIED="1729385886298" TEXT="erzeuge eine Deque mit function-Objekten"/>
@ -90101,14 +90099,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1729386066793" ID="ID_559318620" MODIFIED="1729386488849" TEXT="mu&#xdf; genau auf den konkreten PortData-Builder im NodeBuilder passen"/>
<node CREATED="1729386116639" ID="ID_1942564674" MODIFIED="1729386143654" TEXT="kann aber erst im WeavingBuilder konstruiert werden, wegen POL(Allocator+Context-Poiicy)"/>
</node>
<node CREATED="1729386535588" ID="ID_288497913" MODIFIED="1729386568518" TEXT="ist lediglich eine Typedef + ein Consumer-Functor"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1729386535588" ID="ID_288497913" MODIFIED="1729561744983" TEXT="ist lediglich eine Typedef + ein passender Consumer-Functor">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729386797044" ID="ID_1761275309" MODIFIED="1729477910915" TEXT="Builder-Closure vom WeavingBuilder entkoppeln">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729386815675" ID="ID_1416710632" MODIFIED="1729386828903" TEXT="WeavingBuilder lebt nur tempor&#xe4;r auf dem Stack">
</node>
<node COLOR="#338800" CREATED="1729386797044" ID="ID_1761275309" MODIFIED="1729562612230" TEXT="Builder-Closure vom WeavingBuilder entkoppeln">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1729386815675" ID="ID_1416710632" MODIFIED="1729561753982" TEXT="WeavingBuilder lebt nur tempor&#xe4;r auf dem Stack">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729434130348" ID="ID_1796646662" MODIFIED="1729434165322" TEXT="mu&#xdf; size-Info weitergeben &#x27f9; Funktor allein gen&#xfc;gt nicht">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1729434130348" ID="ID_1796646662" MODIFIED="1729561757254" TEXT="mu&#xdf; size-Info weitergeben &#x27f9; Funktor allein gen&#xfc;gt nicht">
<linktarget COLOR="#56638e" DESTINATION="ID_1796646662" ENDARROW="Default" ENDINCLINATION="138;-8;" ID="Arrow_ID_8244527" SOURCE="ID_1164894748" STARTARROW="None" STARTINCLINATION="246;23;"/>
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1729435375920" ID="ID_232356982" MODIFIED="1729435650306" TEXT="damit bleibt nur eine rekursive funktionale Datenstruktur &#xfc;brig">
@ -90139,12 +90139,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</body>
</html></richcontent>
</node>
<node CREATED="1729435872741" ID="ID_965396577" MODIFIED="1729436935433" TEXT="am Ende entsteht ein Kokon aus verschachtelten Funktoren">
<arrowlink COLOR="#4a3bce" DESTINATION="ID_578956741" ENDARROW="Default" ENDINCLINATION="38;-27;" ID="Arrow_ID_757260520" STARTARROW="None" STARTINCLINATION="-301;14;"/>
<node CREATED="1729435872741" ID="ID_965396577" MODIFIED="1729561709621" TEXT="am Ende entsteht ein Kokon aus verschachtelten Funktoren">
<arrowlink COLOR="#4a3bce" DESTINATION="ID_578956741" ENDARROW="Default" ENDINCLINATION="37;-51;" ID="Arrow_ID_757260520" STARTARROW="None" STARTINCLINATION="-301;14;"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729436890414" ID="ID_578956741" MODIFIED="1729436925222" TEXT="Konstruktion">
<linktarget COLOR="#4a3bce" DESTINATION="ID_578956741" ENDARROW="Default" ENDINCLINATION="38;-27;" ID="Arrow_ID_757260520" SOURCE="ID_965396577" STARTARROW="None" STARTINCLINATION="-301;14;"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#690f14" CREATED="1729436890414" ID="ID_578956741" MODIFIED="1729562593468" TEXT="Konstruktion">
<linktarget COLOR="#4a3bce" DESTINATION="ID_578956741" ENDARROW="Default" ENDINCLINATION="37;-51;" ID="Arrow_ID_757260520" SOURCE="ID_965396577" STARTARROW="None" STARTINCLINATION="-301;14;"/>
<icon BUILTIN="yes"/>
<node CREATED="1729436998673" ID="ID_346385163" MODIFIED="1729437009163" TEXT="ein PortBuilder-Aufruf...">
<node CREATED="1729437015821" ID="ID_1827103976" MODIFIED="1729437036910" TEXT="sammelt Parametrisierungs-Infos auf dem Heap"/>
@ -90224,7 +90224,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1729444822953" ID="ID_1145060657" MODIFIED="1729445566433" TEXT="KISS">
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#ff0000" CREATED="1729444822953" ID="ID_1145060657" MODIFIED="1729561770051" TEXT="KISS">
<icon BUILTIN="yes"/>
</node>
<node CREATED="1729444842118" ID="ID_1809031640" MODIFIED="1729445554172" TEXT="Gefahr vieler Ports anderweitig vermeiden">
@ -90254,9 +90254,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729477829436" ID="ID_669795504" MODIFIED="1729555900220" TEXT="PortBuilder::build() mu&#xdf; nun Build-Funktor erzeugen">
<node COLOR="#338800" CREATED="1729477829436" ID="ID_669795504" MODIFIED="1729562241528" TEXT="PortBuilder::build() mu&#xdf; nun Build-Funktor erzeugen">
<linktarget COLOR="#3d37ad" DESTINATION="ID_669795504" ENDARROW="Default" ENDINCLINATION="-187;-368;" ID="Arrow_ID_91190585" SOURCE="ID_466296328" STARTARROW="None" STARTINCLINATION="-105;399;"/>
<icon BUILTIN="pencil"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1729555298490" ID="ID_1421832672" MODIFIED="1729555506141" TEXT="die Several-Builds komplett entflechten">
<icon BUILTIN="button_ok"/>
<node CREATED="1729555314259" ID="ID_1977364446" MODIFIED="1729555322282" TEXT="leadPort.shrink() zu Beginn"/>
@ -90268,13 +90268,12 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
danach &#252;berhaupt erst <font face="Monospaced" color="#5c2c20">outTypes = DataBuilder&lt;POL, BuffDescr&gt;</font>&#160; erzeugen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#5a758c" DESTINATION="ID_455881892" ENDARROW="Default" ENDINCLINATION="353;-366;" ID="Arrow_ID_1206334910" SOURCE="ID_982363236" STARTARROW="None" STARTINCLINATION="595;21;"/>
</node>
<node CREATED="1729555947647" ID="ID_986884580" MODIFIED="1729555978307" TEXT="beim Verschieben in die &#x3bb;-closure : den Several-Build sofort ausf&#xfc;hren (fixieren)"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729550672047" ID="ID_998453303" MODIFIED="1729550685246" TEXT="der Chain-Konstruktor ist problematisch">
<node COLOR="#435e98" CREATED="1729550672047" ID="ID_998453303" MODIFIED="1729562244532" TEXT="der Chain-Konstruktor ist problematisch">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1729550687877" ID="ID_930534741" MODIFIED="1729551189497" TEXT="er steht in Konkurrenz zum prim&#xe4;ren Konstruktor mit Var-Args">
<richcontent TYPE="NOTE"><html>
@ -90336,7 +90335,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<font NAME="SansSerif" SIZE="9"/>
</node>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1729525573004" ID="ID_1595587422" MODIFIED="1729551640274" TEXT="Problem: direct Funktion-ref decays">
<node COLOR="#435e98" CREATED="1729525573004" ID="ID_1595587422" MODIFIED="1729564371805" TEXT="Problem: direct Funktion-ref decays">
<icon BUILTIN="broken-line"/>
<node CREATED="1729551646837" ID="ID_797477885" MODIFIED="1729551707565" TEXT="OH-Mann!!!">
<richcontent TYPE="NOTE"><html>
@ -90359,10 +90358,63 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1729563316240" ID="ID_1336682909" MODIFIED="1729563332336" TEXT="die L&#xf6;sung ist banal: wir brauchen ein decay">
<icon BUILTIN="idea"/>
<node COLOR="#5b280f" CREATED="1729563334768" ID="ID_833699217" MODIFIED="1729563342438" TEXT="std::decay verwenden">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#c8c0b6" CREATED="1729563343792" ID="ID_1082591011" MODIFIED="1729564367439" TEXT="noch banaler: FUN als value-Argument nehmen">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
Denn std::decay macht genau das, was auch passiert, wenn man ein Argument<i>&#160; by-value</i>&#160;nimmt. Und das ist hier auch aus anderen Gr&#252;nden genau das, was wir brauchen: Egal ob Lambda oder Funktor order Funktions-Referenz, es wird erst mal im Builder materialisiert, und von dort weiter geschoben in die &#955;-closure, welche im Builder f&#252;r den InvocationAdapter abgelegt ist; im Prototyp-Beispiel ist das die Klasse DirectFunctionInvocation. Das &#187;Protokoll&#171; f&#252;r den Turnout und das SimpleWeavingPattern erwartet, da&#223; in diesem Builder eine Fuktion oder ein Funktor buildFeed() gegeben ist. Das bedeutet, f&#252;r jede Invocation wird eine <b>Kopie</b>&#160;der processing-Function gezogen und <b>direkt in den code des InvocationAdapters geinlined</b>. Typischerweise ist die processing-Function selber wiederum als Lamda definiert, und damit erfolgt ein sehr direkter und effizienter Aufruf der eigentlichen Library-Funktion
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729477875734" ID="ID_1268344411" MODIFIED="1729554584154" TEXT="Datenerzeugung &#xfc;ber die Funktoren-Kette">
<icon BUILTIN="pencil"/>
</node>
</node>
<node COLOR="#338800" CREATED="1729477875734" ID="ID_1268344411" MODIFIED="1729562234899" TEXT="Datenerzeugung &#xfc;ber die Funktoren-Kette">
<icon BUILTIN="button_ok"/>
<node CREATED="1729561786675" ID="ID_1261922339" MODIFIED="1729561802746" TEXT="wird erst ganz zuletzt im terminalen NodeBuilder::build() aufgerufen"/>
<node CREATED="1729561804071" ID="ID_868884031" MODIFIED="1729561848542" TEXT="steigt rekursiv bis zur PatternData-Basis-Klasse ab">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
die Zwiebelschalen werden sukzessive dar&#252;ber gelegt, also ist der Anfang ganz innen
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1729561896610" ID="ID_942158916" MODIFIED="1729562035762" TEXT="ermittelt im Durchgang die maximal ben&#xf6;tigte Storage">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...jeder einzelne Turnout-Builder liefert nebenbei auch (&#252;ber einen compile-time-constant-Parameter) die Storage-Size des von ihm generierten Turnout ab; &#252;ber eine max()-Kette finden wir die gr&#246;&#223;te Anforderung, die dann auch als &#187;spread&#171; an den lib::SeveralBuilder &#252;bergeben wird
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1729562062932" ID="ID_1612449578" MODIFIED="1729562087100" TEXT="ganz innen, im PatternDataAnchor wird die Allokation dimensioniert"/>
<node CREATED="1729562090960" ID="ID_1814039747" MODIFIED="1729562123536" TEXT="dann im R&#xfc;ckgang &#xfc;ber die Rekursion werden in vorw&#xe4;rts-Reihenfolge alle builder-&#x3bb; aufgerufen"/>
<node CREATED="1729562125027" ID="ID_1973963222" MODIFIED="1729562208547">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
diese setzen den jeweiligen Turnout direkt per <b><font face="Monospaced">emplace()</font></b>&#160;in die Ziel-Storage
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#3b5a65" DESTINATION="ID_1973963222" ENDARROW="Default" ENDINCLINATION="1150;-31;" ID="Arrow_ID_1910798539" SOURCE="ID_1001603416" STARTARROW="None" STARTINCLINATION="931;37;"/>
</node>
</node>
</node>
</node>