Invocation: clarify role of Buffer-Descriptor and Dependency-Injection

It became clear that a secondary system of connections must be added,
running top-down from a global model context, and thus contrary to the
regular orientation of the node network, which connects upwards from
predecessor to successor, in accordance with the pull principle.

If we accept this wiring as part of the primary structure, it can be
established immediately while building the nodes, thus adding a preconfigured
''pattern of Buffer Descriptors'' to each node, since there is no further
''moving part'' — beyond the wiring to the `BufferProvider`, which thus
becomes part of a global `ModelContext`

As an immediate consequence, the storage for this configuraion should
also be switched to `lib::Several` and handled similar to the primary
node wiring in the Builder...
This commit is contained in:
Fischlurch 2024-07-15 18:52:59 +02:00
parent 968bfb8fab
commit fc9ff9252a
17 changed files with 308 additions and 133 deletions

View file

@ -40,10 +40,10 @@
** just accesses yet another buffer to place the results of calculations.
**
** These additional distinctions and properties are associated with the help of the
** BufferDescriptor, embedded into each BuffHandle. While the engine just uses these
** handles in the way of a pointer, the buffer descriptor acts as an additional tag
** attached to the buffer access, allowing to re-access a context within the
** buffer provider implementation.
** [Buffer Descriptor](\ref BuffDescr), embedded into each BuffHandle. While the engine
** mostly uses these handles in the way of a pointer, the buffer descriptor acts as a
** configuration tag attached to the buffer access, allowing to re-access a context
** within the buffer provider implementation.
**
** @see buffer-provider.hpp
** @see BufferMetadata_test
@ -140,7 +140,7 @@ namespace engine {
/**
* Description of a Buffer-"type".
* Key elements will be used to generate hash IDs,
* to be embedded into a BufferDescriptor.
* to be embedded into a [Buffer Descriptor](\ref BuffDescr).
* Keys are chained hierarchically.
*/
class Key

View file

@ -63,23 +63,23 @@ namespace engine {
* currently locked and usable by client code
*/
bool
BufferProvider::verifyValidity (BufferDescriptor const& bufferID) const
BufferProvider::verifyValidity (BuffDescr const& bufferID) const
{
return meta_->isLocked (bufferID);
}
BufferDescriptor
BuffDescr
BufferProvider::getDescriptorFor (size_t storageSize)
{
return BufferDescriptor (*this, meta_->key (storageSize));
return BuffDescr (*this, meta_->key (storageSize));
}
BufferDescriptor
BuffDescr
BufferProvider::getDescriptorFor(size_t storageSize, TypeHandler specialTreatment)
{
return BufferDescriptor (*this, meta_->key (storageSize, specialTreatment));
return BuffDescr (*this, meta_->key (storageSize, specialTreatment));
}
@ -103,7 +103,7 @@ namespace engine {
metadata::Key& typeKey = meta_->get (typeID);
metadata::Entry& entry = meta_->markLocked(typeKey, storage, implID);
return BuffHandle (BufferDescriptor(*this, entry), storage);
return BuffHandle (BuffDescr(*this, entry), storage);
}
@ -113,14 +113,14 @@ namespace engine {
* client may reasonably assume to get the actual number of buffers, as
* indicated by the return value. A provider may be able to handle
* various kinds of buffers (e.g. of differing size), which are
* distinguished by the \em type embodied into the BufferDescriptor.
* distinguished by _the type embodied into_ the BuffDescr.
* @return maximum number of simultaneously usable buffers of this type,
* to be retrieved later through calls to #lockBuffer.
* @throw error::State when no buffer of this kind can be provided
* @note the returned count may differ from the requested count.
*/
uint
BufferProvider::announce (uint count, BufferDescriptor const& type)
BufferProvider::announce (uint count, BuffDescr const& type)
{
uint actually_possible = prepareBuffers (count, type);
if (!actually_possible)
@ -143,7 +143,7 @@ namespace engine {
* to establish a reliably available baseline.
*/
BuffHandle
BufferProvider::lockBuffer (BufferDescriptor const& type)
BufferProvider::lockBuffer (BuffDescr const& type)
{
REQUIRE (was_created_by_this_provider (type));
@ -203,7 +203,7 @@ namespace engine {
* @note EX_STRONG
*/
void
BufferProvider::attachTypeHandler (BuffHandle const& target, BufferDescriptor const& reference)
BufferProvider::attachTypeHandler (BuffHandle const& target, BuffDescr const& reference)
{
metadata::Entry& metaEntry = meta_->get (target.entryID());
metadata::Entry& refEntry = meta_->get (reference);
@ -237,7 +237,7 @@ namespace engine {
bool
BufferProvider::was_created_by_this_provider (BufferDescriptor const& descr) const
BufferProvider::was_created_by_this_provider (BuffDescr const& descr) const
{
return isSameObject (*this, *descr.provider_);
}
@ -246,10 +246,10 @@ namespace engine {
/* === BufferDescriptor and BuffHandle === */
/* === BuffDescr and BuffHandle === */
bool
BufferDescriptor::verifyValidity() const
BuffDescr::verifyValidity() const
{
ENSURE (provider_);
return provider_->verifyValidity(*this);
@ -257,7 +257,7 @@ namespace engine {
size_t
BufferDescriptor::determineBufferSize() const
BuffDescr::determineBufferSize() const
{
ENSURE (provider_);
return provider_->getBufferSize (*this);
@ -265,7 +265,7 @@ namespace engine {
uint
BufferDescriptor::announce (uint count)
BuffDescr::announce (uint count)
{
ENSURE (provider_);
return provider_->announce(count, *this);
@ -273,7 +273,7 @@ namespace engine {
BuffHandle
BufferDescriptor::lockBuffer()
BuffDescr::lockBuffer()
{
ENSURE (provider_);
return provider_->lockBuffer(*this);
@ -313,7 +313,7 @@ namespace engine {
* This causes the dtor function to be invoked when releasing this buffer.
* The assumption is that client code will placement-construct an object
* into this buffer right away, and thus we're taking ownership on that object.
* @param type a reference BufferDescriptor defining an embedded TypeHandler to use
* @param type a reference BuffDescr defining an embedded TypeHandler to use
* A copy of this TypeHandler will be stored into the local metadata for
* this buffer only, not altering the basic buffer type in any way
* @throw lifecycle error when attempting to treat an buffer not in locked state
@ -322,7 +322,7 @@ namespace engine {
* @note EX_STRONG
*/
void
BuffHandle::takeOwnershipFor(BufferDescriptor const& type)
BuffHandle::takeOwnershipFor(BuffDescr const& type)
{
if (!this->isValid())
throw error::Logic ("attaching an object requires an buffer in locked state", LERR_(LIFECYCLE));

View file

@ -101,9 +101,9 @@ namespace engine {
virtual ~BufferProvider(); ///< this is an ABC
uint announce (uint count, BufferDescriptor const&);
uint announce (uint count, BuffDescr const&);
BuffHandle lockBuffer (BufferDescriptor const&);
BuffHandle lockBuffer (BuffDescr const&);
void emitBuffer (BuffHandle const&);
void releaseBuffer (BuffHandle const&);
@ -111,29 +111,29 @@ namespace engine {
BuffHandle lockBufferFor (ARGS ...args);
/** allow for attaching and owing an object within an already created buffer */
void attachTypeHandler (BuffHandle const& target, BufferDescriptor const& reference);
void attachTypeHandler (BuffHandle const& target, BuffDescr const& reference);
void emergencyCleanup (BuffHandle const& target, bool invokeDtor =false);
/** describe the kind of buffer managed by this provider */
BufferDescriptor getDescriptorFor(size_t storageSize=0);
BufferDescriptor getDescriptorFor(size_t storageSize, TypeHandler specialTreatment);
BuffDescr getDescriptorFor(size_t storageSize=0);
BuffDescr getDescriptorFor(size_t storageSize, TypeHandler specialTreatment);
template<typename BU, typename...ARGS>
BufferDescriptor getDescriptor (ARGS ...args);
BuffDescr getDescriptor (ARGS ...args);
/* === API for BuffHandle internal access === */
bool verifyValidity (BufferDescriptor const&) const;
size_t getBufferSize (HashVal typeID) const;
bool verifyValidity (BuffDescr const&) const;
size_t getBufferSize (HashVal typeID) const;
protected:
BuffHandle buildHandle (HashVal typeID, void* storage, LocalKey const&);
bool was_created_by_this_provider (BufferDescriptor const&) const;
bool was_created_by_this_provider (BuffDescr const&) const;
};
@ -152,7 +152,7 @@ namespace engine {
BuffHandle
BufferProvider::lockBufferFor (ARGS ...args)
{
BufferDescriptor attach_object_automatically = getDescriptor<BU> (forward<ARGS> (args)...);
BuffDescr attach_object_automatically = getDescriptor<BU> (forward<ARGS> (args)...);
return lockBuffer (attach_object_automatically);
}
@ -162,7 +162,7 @@ namespace engine {
* and destroying that embedded object when releasing the buffer.
*/
template<typename BU, typename...ARGS>
BufferDescriptor
BuffDescr
BufferProvider::getDescriptor (ARGS ...args)
{
return getDescriptorFor (sizeof(BU), TypeHandler::create<BU> (forward<ARGS> (args)...));

View file

@ -103,7 +103,7 @@ namespace engine {
inline void
BuffHandle::takeOwnershipFor()
{
BufferDescriptor howto_attach_object_automatically
BuffDescr howto_attach_object_automatically
= descriptor_.provider_->getDescriptor<BU>();
takeOwnershipFor (howto_attach_object_automatically); // EX_STRONG
}

View file

@ -32,18 +32,19 @@
** buffers, and for accessing those buffers, the node needs to keep a table of buffer
** pointers, and for releasing the buffers later on, we utilise the buffer handles.
**
** These buffer handles are based on a buffer descriptor record, which is opaque as far
** as the client is concerned. BufferDescriptor acts as a representation of the type or
** kind of buffer. The only way to obtain such a BufferDescriptor is from a concrete
** BufferProvider implementation. A back-link to this owning and managing provider is
** embedded into the BufferDescriptor, allowing to retrieve an buffer handle, corresponding
** to an actual buffer provided and managed behind the scenes. There is no automatic
** resource management; clients are responsible to invoke BuffHandle#release when done.
** These buffer handles are based on a [Buffer Descriptor record](\ref BuffDescr),
** which is opaque as far as the client is concerned. BuffDescr acts as a representation
** of the type or kind of buffer. The only way to obtain such a BuffDescr is from a concrete
** BufferProvider implementation. A back-link to this owning and managing provider is embedded
** into the BuffDescr, which thus may be used as a _configuration tag,_ allowing to retrieve a
** concrete buffer handle when needed, corresponding to an actual buffer provided and managed
** behind the scenes. There is no automatic resource management; clients are responsible to
** invoke BuffHandle#release when done.
**
** @warning buffer management via BuffHandle and BufferDescriptor does _not automatically
** maintain proper alignment._ Rather, it relies on the storage allocator to provide
** a buffer suitably aligned for the target type to hold. In most cases, this target
** location will actually be storage maintained on heap through some STL collection;
** @warning buffer management via BuffHandle and BuffDescr does _not automatically maintain
** proper alignment._ Rather, it relies on the storage allocator to provide a buffer
** suitably aligned for the target type to hold. In most cases, this target location
** will actually be storage maintained on heap through some STL collection;
** this topic is a possible subtle pitfall non the less.
**
** @see BufferProvider
@ -82,13 +83,13 @@ namespace engine {
* by the BufferProvider, which may use (and even change) the opaque contents
* to organise the internal buffer management.
*/
class BufferDescriptor
class BuffDescr
{
protected:
BufferProvider* provider_;
HashVal subClassification_;
BufferDescriptor(BufferProvider& manager, HashVal detail)
BuffDescr(BufferProvider& manager, HashVal detail)
: provider_(&manager)
, subClassification_(detail)
{ }
@ -120,8 +121,8 @@ namespace engine {
{
typedef StreamType::ImplFacade::DataBuffer Buff;
BufferDescriptor descriptor_;
Buff* pBuffer_;
BuffDescr descriptor_;
Buff* pBuffer_;
public:
@ -129,7 +130,7 @@ namespace engine {
/** @internal a buffer handle may be obtained by "locking"
* a buffer from the corresponding BufferProvider */
BuffHandle(BufferDescriptor const& typeInfo, void* storage = 0)
BuffHandle(BuffDescr const& typeInfo, void* storage = 0)
: descriptor_(typeInfo)
, pBuffer_(static_cast<PBuff>(storage))
{ }
@ -181,7 +182,7 @@ namespace engine {
private:
template<typename BU>
void takeOwnershipFor();
void takeOwnershipFor(BufferDescriptor const& type);
void takeOwnershipFor(BuffDescr const& type);
void emergencyCleanup();
};

View file

@ -80,7 +80,7 @@ namespace engine {
class Builder
{
public:
Builder& announce (uint count, BufferDescriptor const& type);
Builder& announce (uint count, BuffDescr const& type);
BuffTable& build();
};
@ -110,7 +110,7 @@ namespace engine {
inline BuffTable::Builder&
BuffTable::Builder::announce (uint count, BufferDescriptor const& type)
BuffTable::Builder::announce (uint count, BuffDescr const& type)
{
UNIMPLEMENTED ("accept announcement of additional buffer table entries required");
}

View file

@ -49,9 +49,9 @@ namespace engine {
using lib::HashVal;
class BuffDescr;
class BuffHandle;
class BufferProvider;
class BufferDescriptor;

View file

@ -78,7 +78,7 @@ namespace engine {
PBu inBuff;
};
class BufferDescriptor;
class BuffDescr;
/** Obsolete, to be rewritten /////TICKET #826 */
class BuffTableStorage
@ -92,7 +92,7 @@ namespace engine {
: BuffHandle
{
BuffHaXXXX() : BuffHandle(just_satisfy_the_compiler()) { /* wont work ever */ }
static BufferDescriptor const&
static BuffDescr const&
just_satisfy_the_compiler() { }
};

View file

@ -64,7 +64,7 @@ namespace engine {
////////////////////////////////////////////////TICKET #826 expected to be reworked to quite some extent (9/2011)
public:
/** allocate a new writable buffer with type and size according to
* the BufferDescriptor. The actual provider of this buffer depends
* the BuffDescr. The actual provider of this buffer depends
* on the StateClosure implementation; it could be a temporary, located in
* the cache, used for feeding calculated frames over a network, etc.
* @return a BuffHandle encapsulating the information necessary to get

View file

@ -64,7 +64,7 @@ namespace engine {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : to be Reworked for »Playback Vertical Slice«
public:
/** allocate a new writable buffer with type and size according to
* the BufferDescriptor. The actual provider of this buffer depends
* the BuffDescr. The actual provider of this buffer depends
* on the StateClosure implementation; it could be a temporary, located in
* the cache, used for feeding calculated frames over a network, etc.
* @return a BuffHandle encapsulating the information necessary to get

View file

@ -70,6 +70,8 @@
//#include "steam/engine/exit-node.hpp"
//#include "lib/time/timevalue.hpp"
//#include "lib/linked-elements.hpp"
#include "lib/several.hpp"
#include "lib/several-builder.hpp"/////////////////TODO extract with a WeavingPattern builder
//#include "lib/util-foreach.hpp"
//#include "lib/iter-adapter.hpp"
#include "lib/meta/function.hpp"
@ -85,6 +87,7 @@ namespace steam {
namespace engine {
using std::forward;
using lib::Several;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation
/**
@ -394,7 +397,7 @@ namespace engine {
*/
template<uint N, class FUN>
struct Conf_DirectFunctionInvocation
//////////////////////////////OOO non-copyable? move-only??
: util::MoveOnly
{
using Manifold = FeedManifold<N>;
using Feed = SimpleFunctionInvocationAdapter<Manifold, FUN>;
@ -413,12 +416,8 @@ namespace engine {
uint fanIn{0};
uint fanOut{0};
template<class X>
using Storage = lib::UninitialisedStorage<X,CONF::MAX_SIZ>;
Storage<PortRef> leadPort;
Storage<BufferDescriptor> outDescr;
Several<PortRef> leadPort;
Several<BuffDescr> outDescr;
//////////////////////////////////////////OOO builder must set-up those descriptors
@ -433,7 +432,7 @@ namespace engine {
{
for (uint i=0; i<fanIn; ++i)
{
BuffHandle inputData = leadPort[i].weave (turnoutSys);
BuffHandle inputData = leadPort[i].get().weave (turnoutSys);
feed.inBuff.createAt(i, move(inputData));
}
}
@ -511,7 +510,7 @@ namespace engine {
template<uint N, class FUN>
struct SimpleWeavingBuilder
: Turnout<SimpleDirectInvoke<N,FUN>>
: Turnout<SimpleDirectInvoke<N,FUN>> /////////////////////////////////OOO can no longer directly inherit from the product(Turnout), due to SeveralBuilder!!!
{
SimpleWeavingBuilder
attachToLeadPort(ProcNode& lead, uint portNr)
@ -526,6 +525,7 @@ namespace engine {
Turnout<SimpleDirectInvoke<N,FUN>>
build()
{
///////////////////////////////OOO need a way to prepare SeveralBuilder-instances for leadPort and outDescr --> see NodeBuilder
return move(*this);
}
};

View file

@ -30,7 +30,7 @@
** Within the Lumiera Engine, the BufferProvider default implementation utilises instances
** of TypeHandler to _describe specific buffer types_ capable of managing an attached object,
** or requiring some other kind of special treatment of the memory area used for the buffer.
** This BufferDescriptor is embodied into the BufferMetadata::Key and used later on to invoke
** This BuffDescr is embodied into the BufferMetadata::Key and used later on to invoke
** the contained ctor / dtor functors, passing a concrete buffer (memory area).
**
** @see buffer-metadata.hpp

View file

@ -211,7 +211,7 @@ namespace test {
bufferType1 = meta_->key(bufferType1, transaction1);
rawBuffType = meta_->key(rawBuffType, transaction2);
// these type keys are now handed over to the client,
// embedded into a BufferDescriptor...
// embedded into a Buffer Descriptor...
// later, when it comes to actually *locking* those buffers...
typedef char RawBuffer[SIZE_B];

View file

@ -126,8 +126,8 @@ namespace test {
// will be preconfigured, depending on the usage context
BufferProvider& provider = DiagnosticBufferProvider::build();
BufferDescriptor desc1 = provider.getDescriptor<TestFrame>(); // note: implies also sizeof(TestFrame)
BufferDescriptor desc2 = provider.getDescriptorFor(TEST_SIZE);
BuffDescr desc1 = provider.getDescriptor<TestFrame>(); // note: implies also sizeof(TestFrame)
BuffDescr desc2 = provider.getDescriptorFor(TEST_SIZE);
CHECK (desc1.verifyValidity());
CHECK (desc2.verifyValidity());
@ -158,9 +158,9 @@ namespace test {
verifyObjectAttachment()
{
BufferProvider& provider = DiagnosticBufferProvider::build();
BufferDescriptor type_A = provider.getDescriptorFor(sizeof(TestFrame));
BufferDescriptor type_B = provider.getDescriptorFor(sizeof(int));
BufferDescriptor type_C = provider.getDescriptor<int>();
BuffDescr type_A = provider.getDescriptorFor(sizeof(TestFrame));
BuffDescr type_B = provider.getDescriptorFor(sizeof(int));
BuffDescr type_C = provider.getDescriptor<int>();
BuffHandle handle_A = provider.lockBuffer(type_A);
BuffHandle handle_B = provider.lockBuffer(type_B);
@ -195,7 +195,7 @@ namespace test {
verifyObjectAttachmentFailure()
{
BufferProvider& provider = DiagnosticBufferProvider::build();
BufferDescriptor type_D = provider.getDescriptorFor(sizeof(Dummy));
BuffDescr type_D = provider.getDescriptorFor(sizeof(Dummy));
Dummy::checksum() = 0;
BuffHandle handle_D = provider.lockBuffer(type_D);

View file

@ -113,7 +113,7 @@ namespace test {
{
TrackingHeapBlockProvider provider;
BufferDescriptor buffType = provider.getDescriptorFor(TEST_ELM_SIZE);
BuffDescr buffType = provider.getDescriptorFor(TEST_ELM_SIZE);
uint numElms = provider.announce(MAX_ELMS, buffType);
CHECK (0 < numElms);
CHECK (numElms <= MAX_ELMS);
@ -138,7 +138,7 @@ namespace test {
{
TrackingHeapBlockProvider provider;
BufferDescriptor buffType = provider.getDescriptorFor(TEST_ELM_SIZE);
BuffDescr buffType = provider.getDescriptorFor(TEST_ELM_SIZE);
BuffHandle bu1 = provider.lockBuffer (buffType);
BuffHandle bu2 = provider.lockBuffer (buffType);

View file

@ -64,7 +64,7 @@ namespace play {
using lib::time::FrameRate;
using steam::asset::meta::PGrid;
using steam::asset::meta::TimeGrid;
using steam::engine::BufferDescriptor;
using steam::engine::BuffDescr;
using steam::engine::test::TestFrame;
using steam::engine::TrackingHeapBlockProvider;
namespace diagn = steam::engine::diagn;
@ -104,7 +104,7 @@ namespace play {
TrackingHeapBlockProvider buffProvider_;
BufferDescriptor bufferType_;
BuffDescr bufferType_;
FrameTrackingInfo frameTrackingIndex_;
PGrid frameGrid_;

View file

@ -2049,9 +2049,7 @@
<node CREATED="1538277182898" ID="ID_1432000446" MODIFIED="1538277242242" TEXT="Marker-Tabelle leeren"/>
<node CREATED="1538277192232" ID="ID_94588950" MODIFIED="1538277241203" TEXT="Platzhalter-Zeile">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...um den Umstand zu dokumentieren,
@ -2085,9 +2083,7 @@
<node CREATED="1538707192879" ID="ID_253847354" MODIFIED="1538707208726" TEXT="jedes Tag ist einzeln in der Objekt-Hierarchie vorhanden"/>
<node CREATED="1538707176081" ID="ID_1239285032" MODIFIED="1538707284654">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
erscheint <b>definitiv nicht</b>&#160;als CSS-Node
@ -2168,9 +2164,7 @@
</node>
<node CREATED="1538585409653" ID="ID_584738161" MODIFIED="1538585447421">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
...dann Einf&#252;gestelle <i>davor</i>&#160;platzieren
@ -2309,9 +2303,7 @@
<node CREATED="1538707313237" ID="ID_1871755466" MODIFIED="1538707323542" TEXT="Theming-Engine nicht mehr notwendig"/>
<node CREATED="1538707324276" ID="ID_876477218" MODIFIED="1538707360310" TEXT="alternatives Erg&#xe4;nzungs-Stylesheet angelegt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...welches ich zusammen mit meinem
@ -2364,9 +2356,7 @@
<icon BUILTIN="yes"/>
<node CREATED="1538606819103" ID="ID_404941112" MODIFIED="1538607019739" TEXT="Balance">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
denn dieses Design gibt die beste Balance zwischen den Belangen
@ -2896,9 +2886,7 @@
<icon BUILTIN="button_ok"/>
<node CREATED="1534120150460" ID="ID_1726008784" MODIFIED="1538574623534">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<b><font color="#3d51ac">L&#246;sung</font></b>: delegiere &#252;ber zwei Stufen...
@ -3580,9 +3568,7 @@
<node CREATED="1538440224730" ID="ID_973914173" MODIFIED="1538440241131" TEXT="sigTerm-Aufruf aus der run()-Methode herausziehen"/>
<node CREATED="1538440242999" ID="ID_815144668" MODIFIED="1538440276578">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
..damit ~GtkLumiera() garantiert <i>vorher</i>&#160;aufgerufen wird
@ -4642,9 +4628,7 @@
<node CREATED="1481777122306" ID="ID_1506554988" MODIFIED="1518487921057" TEXT="alles im dtor -&gt; noexcept"/>
<node CREATED="1481777210447" ID="ID_1392452935" MODIFIED="1576282358145" TEXT="sicherstellen da&#xdf; shutdown nicht blockt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
1/2017 Review durchgef&#252;hrt und Logik &#252;berarbeitet.
@ -6330,9 +6314,7 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529235342511" ID="ID_1922506931" MODIFIED="1557498707220">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
<b>Aufgabe</b>: docking panels global
@ -8496,9 +8478,7 @@
</node>
<node CREATED="1509583164196" FOLDED="true" HGAP="45" ID="ID_1054378844" MODIFIED="1561827483827" VSHIFT="18">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
monadische L&#246;sung
@ -11741,9 +11721,7 @@
<icon BUILTIN="yes"/>
<node CREATED="1513961667045" ID="ID_688351481" MODIFIED="1513962278992" TEXT="nur Verwenden von bestehenden Bausteinen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
es werden jetzt keine weiteren Features f&#252;r TreeExplorer gebaut....
@ -52971,9 +52949,7 @@
<node CREATED="1492281083479" ID="ID_970079498" MODIFIED="1492281138259" TEXT="fire-and-forget: superfluous"/>
<node CREATED="1492281103684" ID="ID_135245437" MODIFIED="1576282357980" TEXT="widget-bound: overengineered">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und kaum erkennbarer Nutzen.
@ -52989,9 +52965,7 @@
</node>
<node CREATED="1492281124705" ID="ID_256590492" MODIFIED="1576282357980" TEXT="context-bound: different structure needed">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
hier m&#252;&#223;te der InvocationTrail die aufgesammelten Argumente transportieren.
@ -53273,9 +53247,7 @@
<icon BUILTIN="yes"/>
<node CREATED="1617979344655" FOLDED="true" ID="ID_1851586839" MODIFIED="1617979758591" TEXT="deshalb wird die Grundstruktur im Projekt selber entwickelt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...wir versuchen gar nicht erst, &#187;etwas Bestehendes zu nutzen&#171; &#8213; sondern wir machen <i>unser eigenes Ding.</i>
@ -53522,9 +53494,7 @@
</node>
<node CREATED="1492359678835" ID="ID_608610767" MODIFIED="1576282357975" TEXT="explizite Instanzbildung ist optional">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...implementiert &quot;f&#252;r die Zukunft&quot;,
@ -67976,6 +67946,14 @@
</node>
</node>
</node>
<node CREATED="1721058312039" ID="ID_202200971" MODIFIED="1721058318320" TEXT="Modell-Strukturen">
<node CREATED="1721058373845" ID="ID_1036649579" MODIFIED="1721058704362" TEXT="Session &#x27fa; High-Level-Model">
<arrowlink COLOR="#2a45b9" DESTINATION="ID_1490841818" ENDARROW="Default" ENDINCLINATION="-1217;-20;" ID="Arrow_ID_1140294930" STARTARROW="None" STARTINCLINATION="-582;56;"/>
</node>
<node CREATED="1721058373845" ID="ID_1592503678" MODIFIED="1721058516624" TEXT="Engine &#x27fa; Low-Level-Model">
<arrowlink COLOR="#2a45b9" DESTINATION="ID_1041732620" ENDARROW="Default" ENDINCLINATION="-1891;-113;" ID="Arrow_ID_1238969888" STARTARROW="None" STARTINCLINATION="-2532;262;"/>
</node>
</node>
</node>
<node CREATED="1482524498822" ID="ID_431883229" MODIFIED="1557498707236" TEXT="Datenstrom">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#540e80" CREATED="1719689388248" ID="ID_960088183" MODIFIED="1719689669267" STYLE="bubble" TEXT="Stream-Type">
@ -71265,7 +71243,10 @@
</node>
<node CREATED="1533401481917" HGAP="31" ID="ID_1634540822" MODIFIED="1557498707237" TEXT="Struktur" VSHIFT="-19">
<icon BUILTIN="hourglass"/>
<node CREATED="1533918273704" ID="ID_1490841818" MODIFIED="1557498707237" TEXT="Modell">
<node CREATED="1533918273704" ID="ID_1490841818" MODIFIED="1721058704362" TEXT="&#xbb;High-Level-Model&#xab; &#x2259; das gebaute Werk">
<linktarget COLOR="#2a45b9" DESTINATION="ID_1490841818" ENDARROW="Default" ENDINCLINATION="-1217;-20;" ID="Arrow_ID_1140294930" SOURCE="ID_1036649579" STARTARROW="None" STARTINCLINATION="-582;56;"/>
<font NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="forward"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1533918279368" FOLDED="true" ID="ID_90099848" MODIFIED="1720131398331" TEXT="Assets">
<icon BUILTIN="yes"/>
<node CREATED="1533918370708" ID="ID_1044798440" MODIFIED="1557498707237" TEXT="Arten">
@ -82189,16 +82170,49 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721059197447" ID="ID_1741329370" MODIFIED="1721059345996" TEXT="globalen ModelContext einbinden">
<linktarget COLOR="#704a71" DESTINATION="ID_1741329370" ENDARROW="Default" ENDINCLINATION="-1242;96;" ID="Arrow_ID_562327995" SOURCE="ID_1380592229" STARTARROW="None" STARTINCLINATION="-2239;144;"/>
<icon BUILTIN="yes"/>
<node CREATED="1721059363089" ID="ID_283118861" MODIFIED="1721059369010" TEXT="Zweck">
<icon BUILTIN="info"/>
<node CREATED="1721059378917" ID="ID_1450630309" MODIFIED="1721059396201" TEXT="in jeden Port wird ein Muster von BufferDescriptoren eingewoben"/>
<node CREATED="1721059397330" ID="ID_1692352230" MODIFIED="1721059419603" TEXT="diese m&#xfc;ssen auf stabile BufferProvider verweisen k&#xf6;nnen"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721059425785" ID="ID_115679136" MODIFIED="1721059440468" TEXT="konkrete Einbindung in den Builder kl&#xe4;ren">
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
</node>
<node CREATED="1715472577657" ID="ID_302214544" MODIFIED="1715472583381" TEXT="Conststituents">
</node>
</node>
<node CREATED="1715472577657" ID="ID_302214544" MODIFIED="1721059070643" TEXT="Conststituents">
<linktarget COLOR="#213c5d" DESTINATION="ID_302214544" ENDARROW="Default" ENDINCLINATION="-1401;249;" ID="Arrow_ID_1826313960" SOURCE="ID_1408055854" STARTARROW="None" STARTINCLINATION="-2189;-101;"/>
<node CREATED="1715522273278" ID="ID_1913846736" MODIFIED="1715522278674" TEXT="Connectivity">
<node CREATED="1715522355278" ID="ID_643217286" MODIFIED="1715522359472" TEXT="rein statisch"/>
<node CREATED="1715522383162" ID="ID_254070601" MODIFIED="1715522422352" TEXT="Zugang zu allen Vorraussetzungen"/>
<node CREATED="1715523844431" ID="ID_1377189488" MODIFIED="1715523916103" TEXT="incl Descriptoren und Marker f&#xfc;r TurnoutSystem"/>
</node>
<node CREATED="1721057520196" ID="ID_1894774847" MODIFIED="1721057538582" TEXT="Turnout &#x2259; Weaving-Pattern">
<node CREATED="1721057557696" ID="ID_435477330" MODIFIED="1721057580681" TEXT="Baukasten-System"/>
<node CREATED="1721057593582" ID="ID_1758284809" MODIFIED="1721057602054" TEXT="erstellt druch einen komplexen Builder"/>
<node CREATED="1721057602666" ID="ID_382581232" MODIFIED="1721057624965">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
Aufbau erfolgt <i>aus dem Scope</i>&#160;der <b>DomainOntology</b>
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1721057733969" ID="ID_146415839" MODIFIED="1721057895239" TEXT="Model-Context">
<linktarget COLOR="#6b3c6e" DESTINATION="ID_146415839" ENDARROW="Default" ENDINCLINATION="78;328;" ID="Arrow_ID_745350317" SOURCE="ID_969123904" STARTARROW="None" STARTINCLINATION="-1144;-34;"/>
<node CREATED="1721057742515" ID="ID_1582114449" MODIFIED="1721057758682" TEXT="Applikation-Runtime-State"/>
<node CREATED="1721057759756" ID="ID_478735553" MODIFIED="1721057778279" TEXT="bietet eine Service-Palette"/>
<node CREATED="1721057778908" ID="ID_227275519" MODIFIED="1721057787928" TEXT="zentral: die BufferProvider"/>
</node>
<node CREATED="1715525109342" ID="ID_1198302937" MODIFIED="1715525114482" TEXT="FeedManifold">
<node CREATED="1715525115406" ID="ID_1864118924" MODIFIED="1715525120160" TEXT="transient pro Aufruf"/>
<node CREATED="1715525121189" ID="ID_1124710161" MODIFIED="1715525144454" TEXT="verweist auf alle Eingabe + Ausgabe-Buffer"/>
@ -86670,6 +86684,57 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1721055613353" ID="ID_562004793" MODIFIED="1721059658752">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
ein Zwischending: <b><font face="Monospaced">BufferDescriptor</font></b>
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#516883" DESTINATION="ID_562004793" ENDARROW="Default" ENDINCLINATION="-1136;1066;" ID="Arrow_ID_1799901944" SOURCE="ID_824337184" STARTARROW="None" STARTINCLINATION="-504;-31;"/>
<icon BUILTIN="idea"/>
<node CREATED="1721055699118" ID="ID_737732212" MODIFIED="1721055713648" TEXT="steht au&#xdf;erhalb des Buffer-handling-Protocol"/>
<node CREATED="1721055718404" ID="ID_1318231313" MODIFIED="1721055721415" TEXT="2 Datenfelder">
<node CREATED="1721055725890" ID="ID_1692684773" MODIFIED="1721055736164" TEXT="(Back)Link zum BufferProvider"/>
<node CREATED="1721055737689" ID="ID_131973141" MODIFIED="1721055760386" TEXT="Hash-Tag &#x27fc; Typ- und Usage-Info"/>
</node>
<node CREATED="1721055770407" ID="ID_401637361" MODIFIED="1721055871048" TEXT="beide Felder k&#xf6;nnen f&#xfc;r jeden &#xbb;Slot&#xab; variieren">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<ul>
<li>
das bedeutet: dies ist die Quintessenz der Buffer-Konfiguration und damit die Minimal-Information, die wir f&#252;r jeden Slot fest vorbelegen m&#252;ssen.
</li>
<li>
allerdings k&#246;nnte man noch &#252;ber eine kompaktere Repr&#228;sentation im Speicher nachdenken...
</li>
</ul>
</body>
</html>
</richcontent>
</node>
<node CREATED="1721056911246" ID="ID_1624189638" MODIFIED="1721056920388" TEXT="Einsichten/Feststellungen">
<icon BUILTIN="forward"/>
<node CREATED="1721056923434" ID="ID_1601207295" MODIFIED="1721056943281" TEXT="effektiv fest und Teil des Node-Patterns"/>
<node CREATED="1721056946016" ID="ID_409561952" MODIFIED="1721057299595" TEXT="stellt aber einen aufw&#xe4;rts-Verweis dar">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...im Gegensatz zum Baumuster des Node-Graphen, der stets abw&#228;rts gerichtet ist: eine Node kennt nur ihre Vorl&#228;ufer, aber der BufferDescriptor verweist aufw&#228;rts auf einen globalen Service
</p>
</body>
</html>
</richcontent>
<arrowlink COLOR="#741b46" DESTINATION="ID_1203624262" ENDARROW="Default" ENDINCLINATION="387;-47;" ID="Arrow_ID_1836206594" STARTARROW="None" STARTINCLINATION="-442;32;"/>
<arrowlink COLOR="#582132" DESTINATION="ID_969123904" ENDARROW="Default" ENDINCLINATION="228;-13;" ID="Arrow_ID_617307110" STARTARROW="None" STARTINCLINATION="-442;32;"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1719162654773" ID="ID_1902060576" MODIFIED="1719162671608" TEXT="wer bekommt einen OutputSlot, und wer eine (ge&#xf6;ffnete) DataSink?">
<icon BUILTIN="help"/>
@ -86764,12 +86829,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720485164922" ID="ID_946422034" MODIFIED="1720537661229" TEXT="Zusammenfassung: gebraucht wird...">
<linktarget COLOR="#5a6072" DESTINATION="ID_946422034" ENDARROW="Default" ENDINCLINATION="-44;119;" ID="Arrow_ID_1415360970" SOURCE="ID_1545807598" STARTARROW="Default" STARTINCLINATION="-103;-6;"/>
<icon BUILTIN="forward"/>
<node CREATED="1719162399039" ID="ID_1427714372" MODIFIED="1719162422735" TEXT="BufferProvider">
<node CREATED="1719162399039" ID="ID_1427714372" MODIFIED="1721003900784" TEXT="BufferProvider">
<linktarget COLOR="#426b9b" DESTINATION="ID_1427714372" ENDARROW="Default" ENDINCLINATION="-959;175;" ID="Arrow_ID_770296022" SOURCE="ID_1733464902" STARTARROW="None" STARTINCLINATION="-446;-54;"/>
<node CREATED="1719162514087" ID="ID_1314603800" MODIFIED="1719162521740" TEXT="f&#xfc;r Working Buffers"/>
<node CREATED="1719162522590" ID="ID_452219645" MODIFIED="1719162528681" TEXT="als Front-End f&#xfc;r den Cache"/>
<node CREATED="1720485474864" ID="ID_1017929654" MODIFIED="1720485489986" TEXT="als Front-End f&#xfc;r OutputSlot / DataSink"/>
</node>
<node CREATED="1720487984471" ID="ID_373338353" MODIFIED="1720488077751" TEXT="&#xbb;nominal Time&#xab; (&#x27f6; Frame-Koordinaten)"/>
<node CREATED="1721057100380" ID="ID_969123904" MODIFIED="1721058149180" TEXT="globaler Anker &#x27fc; BufferProvider">
<arrowlink COLOR="#6b3c6e" DESTINATION="ID_146415839" ENDARROW="Default" ENDINCLINATION="78;328;" ID="Arrow_ID_745350317" STARTARROW="None" STARTINCLINATION="-1144;-34;"/>
<linktarget COLOR="#582132" DESTINATION="ID_969123904" ENDARROW="Default" ENDINCLINATION="228;-13;" ID="Arrow_ID_617307110" SOURCE="ID_409561952" STARTARROW="None" STARTINCLINATION="-442;32;"/>
<icon BUILTIN="yes"/>
<node CREATED="1721059105356" HGAP="41" ID="ID_1380592229" MODIFIED="1721059345996" TEXT="per ModelContext bereits beim Build gegeben" VSHIFT="14">
<arrowlink COLOR="#704a71" DESTINATION="ID_1741329370" ENDARROW="Default" ENDINCLINATION="-1242;96;" ID="Arrow_ID_562327995" STARTARROW="None" STARTINCLINATION="-2239;144;"/>
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1720487794240" ID="ID_1764380247" MODIFIED="1720487811199" TEXT="Vorsicht: es kann im Einzelfall weitere Services geben">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1720487814454" ID="ID_1198130205" MODIFIED="1720487832128" TEXT="diese h&#xe4;ngen typischerweise direkt mit der Domain zusammen"/>
@ -88100,7 +88174,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#3c3267" DESTINATION="ID_861820571" ENDARROW="Default" ENDINCLINATION="65;-527;" ID="Arrow_ID_1939934739" STARTARROW="None" STARTINCLINATION="1714;371;"/>
<arrowlink COLOR="#3c3267" DESTINATION="ID_861820571" ENDARROW="Default" ENDINCLINATION="65;-527;" ID="Arrow_ID_1939934739" STARTARROW="None" STARTINCLINATION="2296;496;"/>
<node CREATED="1720995730036" ID="ID_578172689" MODIFIED="1720995740742" TEXT="bedeutet: nur f&#xfc;r die Ausgabeseite"/>
</node>
<node CREATED="1720995744334" ID="ID_1219900691" MODIFIED="1720995772028" TEXT="danach: releaseBuffer()">
@ -88131,7 +88205,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720999952601" ID="ID_773939367" MODIFIED="1720999968167" TEXT="stelle fest: brauche einen Weaving-Pattern-Builder">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721003436766" ID="ID_1888404885" MODIFIED="1721003651235" TEXT="AUA &#x2014; das wird sauschwer....">
<arrowlink COLOR="#b90172" DESTINATION="ID_1111138525" ENDARROW="Default" ENDINCLINATION="2;-47;" ID="Arrow_ID_248579830" STARTARROW="None" STARTINCLINATION="-4;46;"/>
<icon BUILTIN="smily_bad"/>
<node CREATED="1721003505076" ID="ID_1263811335" MODIFIED="1721003523198" TEXT="es werden mehrere Familien von Weaving-Patterns"/>
<node CREATED="1721003524290" ID="ID_1567870682" MODIFIED="1721003537897" TEXT="f&#xfc;r diese gibt es dann jeweils mehrere Layer"/>
<node CREATED="1721003547198" ID="ID_1259373939" MODIFIED="1721003577763">
<richcontent TYPE="NODE"><html>
<head/>
<body>
<p>
und all dies mu&#223; in einen <b>verst&#228;ndliche Builder-DSL</b>&#160; verpackt werden
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1721003586265" ID="ID_833935002" MODIFIED="1721003607658" TEXT="und obendrauf kommen nochmal jeweils spezielle Konfigurations-APIs"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721000066150" ID="ID_1111138525" MODIFIED="1721000102756" TEXT="auch dieses per Prototyping ausarbeiten">
<linktarget COLOR="#b90172" DESTINATION="ID_1111138525" ENDARROW="Default" ENDINCLINATION="2;-47;" ID="Arrow_ID_248579830" SOURCE="ID_1888404885" STARTARROW="None" STARTINCLINATION="-4;46;"/>
<icon BUILTIN="yes"/>
<node CREATED="1721001272080" ID="ID_1644136965" MODIFIED="1721001278238" TEXT="mu&#xdf; irgendwie N festlegen"/>
<node CREATED="1721001278759" ID="ID_1598574377" MODIFIED="1721001291674" TEXT="weitere Schwierigkeit: die FUN initialisieren"/>
@ -88141,6 +88233,29 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1721001829710" ID="ID_1175533988" MODIFIED="1721001854628" TEXT="&#x27f9; fortlaufend einen neuen Builder-Typ zur&#xfc;ckgeben"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1721059894928" ID="ID_30595541" MODIFIED="1721061467060" TEXT="feste Datenstruktur: auf lib::Several aufbauen">
<icon BUILTIN="pencil"/>
<node COLOR="#5b280f" CREATED="1721059912394" ID="ID_1994703894" MODIFIED="1721059935213" TEXT="UninitialisedStorage-Bl&#xf6;cke sind nur sinnvoll auf dem Heap">
<icon BUILTIN="stop-sign"/>
<node CREATED="1721059940032" ID="ID_1055982491" MODIFIED="1721059947798" TEXT="sie sollen liegen bleiben wo sie sind"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1721059948549" ID="ID_1596496593" MODIFIED="1721059977249" TEXT="move funktioniert zwar (bedingt) &#x2014; ist aber aufwendig">
<icon BUILTIN="clanbomber"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1721061468811" ID="ID_137792611" MODIFIED="1721061603553" TEXT="brauche dann aber einen DataBuilder">
<icon BUILTIN="yes"/>
<node CREATED="1721061478810" ID="ID_1413132436" MODIFIED="1721061494590" TEXT="das ist die gleiche L&#xf6;sung, die ich schon f&#xfc;r den NodeBuilder verwende">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1721061496223" ID="ID_1175711026" MODIFIED="1721061518294" TEXT="&#x27f9; Konsequenz: kann nicht mehr das Produkt als Mix-In im Builder haben"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721061520328" ID="ID_447898484" MODIFIED="1721061541850" TEXT="mu&#xdf; stattdessen das Produkt (Tunrout) explizit konstruieren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721061543907" ID="ID_631078035" MODIFIED="1721061556523" TEXT="tempor&#xe4;re Arbeitsdaten im Builder einf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1721002518189" ID="ID_539153824" MODIFIED="1721002527069" TEXT="Lead-Ports einf&#xfc;llen">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721002528188" ID="ID_1483660753" MODIFIED="1721002546307" TEXT="Ha! kann fanIn schrittweise hochz&#xe4;hlen">
<icon BUILTIN="idea"/>
@ -88150,11 +88265,39 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721002564319" ID="ID_566779431" MODIFIED="1721002578582" TEXT="Connectivity herausf&#xfc;hren">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721002570214" ID="ID_1634824320" MODIFIED="1721002578582" TEXT="verwendet RefArray">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721002570214" ID="ID_1634824320" MODIFIED="1721059868212" TEXT="verwendet lib::Several">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721003669494" ID="ID_1156553605" MODIFIED="1721059806306" TEXT="Buffer-Descriptoren einf&#xfc;llen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721003692002" ID="ID_1197626353" MODIFIED="1721055346285" TEXT="damit stellt sich doch noch das Thema Dependency-Injection">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1719162399039" ID="ID_1733464902" MODIFIED="1721003900784" TEXT="brauche BufferProvider">
<arrowlink COLOR="#426b9b" DESTINATION="ID_1427714372" ENDARROW="Default" ENDINCLINATION="-959;175;" ID="Arrow_ID_770296022" STARTARROW="None" STARTINCLINATION="-446;-54;"/>
<node CREATED="1719162514087" ID="ID_416948245" MODIFIED="1719162521740" TEXT="f&#xfc;r Working Buffers"/>
<node CREATED="1719162522590" ID="ID_545575789" MODIFIED="1719162528681" TEXT="als Front-End f&#xfc;r den Cache"/>
<node CREATED="1720485474864" ID="ID_1518497515" MODIFIED="1720485489986" TEXT="als Front-End f&#xfc;r OutputSlot / DataSink"/>
</node>
<node CREATED="1721059527488" ID="ID_824337184" MODIFIED="1721059685476" TEXT="tats&#xe4;chlich liegt diese Info bereits im BufferDescriptor">
<arrowlink COLOR="#516883" DESTINATION="ID_562004793" ENDARROW="Default" ENDINCLINATION="-1136;1066;" ID="Arrow_ID_1799901944" STARTARROW="None" STARTINCLINATION="-504;-31;"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721004007263" ID="ID_786297934" LINK="#ID_1545807598" MODIFIED="1721059679494" TEXT="diese Bez&#xfc;ge kommen aus einem &#xbb;Service-Kontext&#xab;">
<icon BUILTIN="idea"/>
<node CREATED="1721059719341" ID="ID_1138040537" MODIFIED="1721059730831" TEXT="sie werden aber bereits zur Build-Zeit gelinkt"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721059780060" ID="ID_611993343" MODIFIED="1721059787267" TEXT="daf&#xfc;r geeigneten Aufruf schaffen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1721003681836" ID="ID_536010685" MODIFIED="1721061587708" TEXT="erst mal: Bulk-Konfig f&#xfc;r alle">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1721061573297" ID="ID_1009592243" MODIFIED="1721061586060" TEXT="Variante: einzelne Buffer speziell konfigurieren">
<icon BUILTIN="hourglass"/>
</node>
</node>
</node>
</node>
</node>
@ -88180,8 +88323,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
aber festgelegt wird sie <i>beim Bauen </i>des Turnout
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>
@ -88205,6 +88347,24 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="yes"/>
</node>
</node>
<node CREATED="1721057100380" ID="ID_1203624262" MODIFIED="1721057258792" TEXT="globaler Anker notwendig">
<linktarget COLOR="#741b46" DESTINATION="ID_1203624262" ENDARROW="Default" ENDINCLINATION="387;-47;" ID="Arrow_ID_1836206594" SOURCE="ID_409561952" STARTARROW="None" STARTINCLINATION="-442;32;"/>
<icon BUILTIN="yes"/>
<node CREATED="1721057338932" ID="ID_1698555501" MODIFIED="1721057378222" TEXT="dieser mu&#xdf; bereits zum Aufbau der Node-Struktur fixiert sein">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...denn wir verweisen darauf per Referenz oder Pointer
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1721057380696" ID="ID_1842742383" MODIFIED="1721057393025" TEXT="er besteht aus einem Satz BufferProvider"/>
<node CREATED="1721057428416" ID="ID_709482532" MODIFIED="1721057444074" TEXT="diese stellen ihrerseits eine Abstraktion/Indirektion dar"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1720285361113" ID="ID_1765678054" MODIFIED="1720285365141" TEXT="anlegen....">
<icon BUILTIN="flag-yellow"/>
@ -89306,6 +89466,20 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1680563454868" ID="ID_1187556686" MODIFIED="1680563459014" TEXT="Backbone"/>
<node CREATED="1721058213825" ID="ID_1041732620" MODIFIED="1721058516624" TEXT="&#xbb;Low-Level-Model&#xab; &#x2259; Render-Node-Network">
<linktarget COLOR="#2a45b9" DESTINATION="ID_1041732620" ENDARROW="Default" ENDINCLINATION="-1891;-113;" ID="Arrow_ID_1238969888" SOURCE="ID_1592503678" STARTARROW="None" STARTINCLINATION="-2532;262;"/>
<font NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="forward"/>
<node CREATED="1721058746081" ID="ID_1024079886" MODIFIED="1721058750070" TEXT="Bedeutung">
<icon BUILTIN="info"/>
</node>
<node CREATED="1721058752144" ID="ID_593885388" MODIFIED="1721058786122" TEXT="Grundelemente">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1721058935486" ID="ID_1408055854" MODIFIED="1721059070643" TEXT="erster Aufbau Render-Engine (&#xbb;Playback Vertical Slice&#xab;)">
<arrowlink COLOR="#213c5d" DESTINATION="ID_302214544" ENDARROW="Default" ENDINCLINATION="-1401;249;" ID="Arrow_ID_1826313960" STARTARROW="None" STARTINCLINATION="-2189;-101;"/>
<icon BUILTIN="pencil"/>
</node>
</node>
</node>
<node CREATED="1680563460649" ID="ID_127710483" MODIFIED="1715624384997" TEXT="MemManagement">
<arrowlink COLOR="#454059" DESTINATION="ID_1595450559" ENDARROW="Default" ENDINCLINATION="-1036;-77;" ID="Arrow_ID_1704085390" STARTARROW="None" STARTINCLINATION="-161;430;"/>
<node CREATED="1715623566743" ID="ID_688601712" MODIFIED="1716848678808" TEXT="AllocationCluster">
@ -127593,7 +127767,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1720994598433" ID="ID_398873507" MODIFIED="1720994600241" TEXT="lock"/>
<node CREATED="1720994600873" ID="ID_1936046577" MODIFIED="1720994602301" TEXT="emit">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1720994846469" ID="ID_861820571" MODIFIED="1720995711866" TEXT="Semantik noch nicht klar">
<linktarget COLOR="#3c3267" DESTINATION="ID_861820571" ENDARROW="Default" ENDINCLINATION="65;-527;" ID="Arrow_ID_1939934739" SOURCE="ID_686121956" STARTARROW="None" STARTINCLINATION="1714;371;"/>
<linktarget COLOR="#3c3267" DESTINATION="ID_861820571" ENDARROW="Default" ENDINCLINATION="65;-527;" ID="Arrow_ID_1939934739" SOURCE="ID_686121956" STARTARROW="None" STARTINCLINATION="2296;496;"/>
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="help"/>
<node CREATED="1720994865067" ID="ID_347998785" MODIFIED="1720995165926" TEXT="wird er dadurch read-only?"/>