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:
parent
df37fec500
commit
554a64e212
6 changed files with 233 additions and 144 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ namespace test {
|
|||
{
|
||||
auto con = prepareNode()
|
||||
.preparePort()
|
||||
.invoke(&dummyOp)
|
||||
.invoke(dummyOp)
|
||||
.completePort()
|
||||
.build();
|
||||
CHECK (isnil (con.leads));
|
||||
|
|
|
|||
|
|
@ -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ällt auf <i>eine</i> mögliche Substitution zurück
|
||||
|
|
@ -9521,9 +9519,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
unter der Annahme, daß wir beim <b>Lumiera Forward Iterator</b> - 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ösungen mü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> pro Typ
|
||||
|
|
@ -19816,9 +19808,7 @@
|
|||
<node CREATED="1664059679707" ID="ID_1826707626" MODIFIED="1664059710722" TEXT="Name-ID genügt ⟹ Zugang zum konkreten Medium via Steam"/>
|
||||
<node CREATED="1664059758792" ID="ID_665980098" MODIFIED="1664059964811" TEXT="[nur temporär] laufende Renderer-Instanz">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
analog wie ein Player; während das Content-Rendering läuft muß der Clip eine Registrierung in einem zustä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ür jeden Frame eines Video, sondern brauchen hier wohl eine Art lokales Caching; das heißt, die Pixmaps fü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ür diesen Zweck mitbenutzen; schließlich dürften diese Vorschaubilder die häufigsten laufenden Rendervorgä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önnten fü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:   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äten non-Copyable sein"/>
|
||||
<node COLOR="#3a0830" CREATED="1728918063615" ID="ID_1224903798" MODIFIED="1729562503204" TEXT="�� 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äten non-Copyable sein">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1729562526605" ID="ID_1731450489" MODIFIED="1729562540592" TEXT="erschien mir zunächst unmöglich"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#690f14" CREATED="1729562541540" ID="ID_122993656" LINK="#ID_578956741" MODIFIED="1729562593469" TEXT="hab'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 üblichen Builder-Definitionsschema">
|
||||
<node CREATED="1728918596625" ID="ID_937405626" MODIFIED="1728918624201" TEXT="insofern ein Builder ein Resultat zurückliefert"/>
|
||||
<node CREATED="1728918625957" ID="ID_709289044" MODIFIED="1728918781196" TEXT="Klassen aus Member/Parent aufbauen (keine Referenz)"/>
|
||||
|
|
@ -89640,7 +89625,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1728918387245" ID="ID_188010599" MODIFIED="1728918420109" TEXT="außerdem: lib::SeveralBuilder braucht nothrow-Movable für ein realloc()"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728918432543" ID="ID_1719167814" MODIFIED="1728921685603" TEXT="und konkret verhält sich der Compiler überraschend (Copy-Konstruktor)">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1728918432543" ID="ID_1719167814" MODIFIED="1728922210152" TEXT="und konkret verhält sich der Compiler überraschend (Copy-Konstruktor)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -89652,6 +89637,7 @@ Date:   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ü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:   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ä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ächlich ein Problem hier)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -89681,6 +89667,7 @@ Date:   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üß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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1728919511214" ID="ID_717691514" MODIFIED="1728919518364" TEXT="Lösungs-Strategien">
|
||||
<node CREATED="1728919519861" ID="ID_893369954" MODIFIED="1728919531258" TEXT="Port tatsächlich non-copyable machen">
|
||||
<node COLOR="#435e98" CREATED="1728919511214" ID="ID_717691514" MODIFIED="1729562426291" TEXT="Lösungs-Strategien">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1728919519861" ID="ID_893369954" MODIFIED="1729562341054" TEXT="Port tatsächlich non-copyable machen">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1728919575373" ID="ID_1789193481" MODIFIED="1728919601059" TEXT="dann müßte der WeavingBuilder per Seiteneffekt in emplacen">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1728919603437" ID="ID_1351297042" MODIFIED="1728919611061" TEXT="das wäre definitiv machbar"/>
|
||||
|
|
@ -89720,12 +89709,12 @@ Date:   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ösungen">
|
||||
<node BACKGROUND_COLOR="#d9dfee" COLOR="#435e98" CREATED="1728920314192" ID="ID_147357026" MODIFIED="1729562403193" TEXT="Lösungen">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#5b280f" CREATED="1728920326985" ID="ID_548153639" MODIFIED="1729477474451" TEXT="benö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:   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="»MoveOnlyNothrow« wäre dann eine neue Variante">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -89771,16 +89762,18 @@ Date:   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üßte man letztlich ein MoveOnlyNothrow einführen"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1728921157089" ID="ID_1600081549" MODIFIED="1728921342782" TEXT="und der Several-Builder muß das wissen">
|
||||
<node BACKGROUND_COLOR="#f1e5a6" COLOR="#a50125" CREATED="1728921157089" ID="ID_1600081549" MODIFIED="1729562837190" TEXT="und der Several-Builder muß 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 ≡ E ≔ 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:   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ßgenaue Allokation ist eigens sicherzustellen">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1729302196298" ID="ID_1847553313" MODIFIED="1729562797498" TEXT="eine paß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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1729302877288" ID="ID_1127038030" MODIFIED="1729302925317" TEXT="damit scheidet die Lösung aus, daß der Client die benötigten Daten »vordimensioniert«">
|
||||
<icon BUILTIN="closed"/>
|
||||
</node>
|
||||
<node CREATED="1729302940255" ID="ID_1001603416" MODIFIED="1729302987650" TEXT="der Build-Vorgang muß kompakt in der terminalen Operation stattfinden">
|
||||
<node CREATED="1729302940255" ID="ID_1001603416" MODIFIED="1729562224737" TEXT="der Build-Vorgang muß 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ßgenauen Implementierung">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1729303081050" ID="ID_1966477380" MODIFIED="1729562785747" TEXT="Ausarbeiten einer paß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:   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ß eine automatische Dimensionierung erfolgen"/>
|
||||
</node>
|
||||
<node CREATED="1729305640248" ID="ID_1661765820" MODIFIED="1729305648785" TEXT="Analyse der Einzelvorgänge">
|
||||
<node COLOR="#435e98" CREATED="1729305640248" ID="ID_1661765820" MODIFIED="1729562776603" TEXT="Analyse der Einzelvorgä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:   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' bereits eine Type-Erasure machen">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1729308176710" ID="ID_70235871" MODIFIED="1729562733053" TEXT="Wichtig: am Ende des PortBuilder' bereits eine Type-Erasure machen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
denn der konkrete Funktionstyp und das N (≙Manifold-Größe), sowie ggfs. ein alternativer »InvocationAdapter«-Typ sind zunächst im konkreten Typ des PortBuilders angelegt (als Typ-Kontext); das bedeutet, das Parameter-Tupel muß aus lauter Wrappern bestehen, die die konkreten Typen bereits materialisiert und virtualisiert enthalten. Fü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äre wohl noch ein weiterer Generator-Functor notwendig, in dem man den konkreten InvocationAdapter versteckt
|
||||
denn der konkrete Funktionstyp und das N (≙Manifold-Größe), sowie ggfs. ein alternativer »InvocationAdapter«-Typ sind zunächst im konkreten Typ des PortBuilders angelegt (als Typ-Kontext); das bedeutet, das Parameter-Satz muß aus lauter Wrappern bestehen, die die konkreten Typen bereits materialisiert und virtualisiert enthalten. Fü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ä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 λ-closure" VSHIFT="15">
|
||||
<node COLOR="#435e98" CREATED="1729555599082" HGAP="21" ID="ID_466296328" MODIFIED="1729562624713" TEXT="durch λ-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:   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ß des Build-Vorganges ist lediglich eine Verzögerung per Closure notwendig">
|
||||
<node COLOR="#435e98" CREATED="1729379729417" ID="ID_1951268337" MODIFIED="1729562754287" TEXT="zum Abschluß des Build-Vorganges ist lediglich eine Verzö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ür Build-Ergebnis schaffen">
|
||||
<node COLOR="#435e98" CREATED="1729385821879" ID="ID_562398626" MODIFIED="1729561730249" TEXT="neues Interface fü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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1729386066793" ID="ID_559318620" MODIFIED="1729386488849" TEXT="muß 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ä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är auf dem Stack">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1729434130348" ID="ID_1796646662" MODIFIED="1729434165322" TEXT="muß size-Info weitergeben ⟹ Funktor allein genügt nicht">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1729434130348" ID="ID_1796646662" MODIFIED="1729561757254" TEXT="muß size-Info weitergeben ⟹ Funktor allein genü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 übrig">
|
||||
|
|
@ -90139,12 +90139,12 @@ Date:   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:   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:   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ß nun Build-Funktor erzeugen">
|
||||
<node COLOR="#338800" CREATED="1729477829436" ID="ID_669795504" MODIFIED="1729562241528" TEXT="PortBuilder::build() muß 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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
danach überhaupt erst <font face="Monospaced" color="#5c2c20">outTypes = DataBuilder<POL, BuffDescr></font>  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 λ-closure : den Several-Build sofort ausfü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ären Konstruktor mit Var-Args">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -90336,7 +90335,7 @@ Date:   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:   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ö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>  by-value</i> nimmt. Und das ist hier auch aus anderen Grü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 λ-closure, welche im Builder für den InvocationAdapter abgelegt ist; im Prototyp-Beispiel ist das die Klasse DirectFunctionInvocation. Das »Protokoll« für den Turnout und das SimpleWeavingPattern erwartet, daß in diesem Builder eine Fuktion oder ein Funktor buildFeed() gegeben ist. Das bedeutet, für jede Invocation wird eine <b>Kopie</b> 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 über die Funktoren-Kette">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1729477875734" ID="ID_1268344411" MODIFIED="1729562234899" TEXT="Datenerzeugung ü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ü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ötigte Storage">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...jeder einzelne Turnout-Builder liefert nebenbei auch (über einen compile-time-constant-Parameter) die Storage-Size des von ihm generierten Turnout ab; über eine max()-Kette finden wir die größte Anforderung, die dann auch als »spread« an den lib::SeveralBuilder ü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ückgang über die Rekursion werden in vorwärts-Reihenfolge alle builder-λ 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> 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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue