From 8c536fc637ea4a5ab41ff51393ebd89a2368d213 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 29 Jun 2024 04:23:55 +0200 Subject: [PATCH] Invocation: consider what is required to setup a `FeedManifold` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...and this line of analysis brings us deep into the ''Buffer Provider'' concept developed in 2012 — which appears to be very well to the point and stands the test of time. Adding some ''variadic arguments'' at the right place surprisingly leads to an ''extension point'' — which in turn directly taps into the still quite uncharted territory interfacing to a **Domain Ontology**; the latter is assumed to define how to deal with entities and relationships defined by some media handling library like e.g. FFmpeg. So what we're set to do here is actually ''ontology mapping....'' --- src/steam/engine/buffer-provider.hpp | 22 +- src/steam/engine/connectivity-obsolete.hpp | 8 - src/steam/engine/feed-manifold.hpp | 129 +------ src/steam/engine/node-wiring-builder.hpp | 140 +------ src/steam/engine/nodewiring-obsolete.hpp | 134 ++++++- src/steam/engine/proc-node.hpp | 3 +- src/steam/engine/turnout.hpp | 2 +- src/steam/engine/type-handler.hpp | 32 +- .../core/steam/engine/feed-manifold-test.cpp | 6 +- tests/core/steam/engine/node-linkage-test.cpp | 51 ++- .../core/steam/engine/test-rand-ontology.hpp | 66 ++++ wiki/thinkPad.ichthyo.mm | 355 ++++++++++++++---- 12 files changed, 571 insertions(+), 377 deletions(-) create mode 100644 tests/core/steam/engine/test-rand-ontology.hpp diff --git a/src/steam/engine/buffer-provider.hpp b/src/steam/engine/buffer-provider.hpp index 2972f2eef..44fc4bbdb 100644 --- a/src/steam/engine/buffer-provider.hpp +++ b/src/steam/engine/buffer-provider.hpp @@ -50,6 +50,7 @@ #include "steam/engine/buffer-local-key.hpp" #include "lib/nocopy.hpp" +#include #include @@ -58,6 +59,7 @@ namespace engine { using lib::Literal; using std::unique_ptr; + using std::forward; class BufferMetadata; @@ -105,8 +107,8 @@ namespace engine { void emitBuffer (BuffHandle const&); void releaseBuffer (BuffHandle const&); - template - BuffHandle lockBufferFor (); + template + BuffHandle lockBufferFor (ARGS ...args); /** allow for attaching and owing an object within an already created buffer */ void attachTypeHandler (BuffHandle const& target, BufferDescriptor const& reference); @@ -118,8 +120,8 @@ namespace engine { BufferDescriptor getDescriptorFor(size_t storageSize=0); BufferDescriptor getDescriptorFor(size_t storageSize, TypeHandler specialTreatment); - template - BufferDescriptor getDescriptor(); + template + BufferDescriptor getDescriptor (ARGS ...args); @@ -146,11 +148,11 @@ namespace engine { * buffer descriptor. The corresponding buffer * has been allocated and marked for exclusive use */ - template + template BuffHandle - BufferProvider::lockBufferFor() + BufferProvider::lockBufferFor (ARGS ...args) { - BufferDescriptor attach_object_automatically = getDescriptor(); + BufferDescriptor attach_object_automatically = getDescriptor (forward (args)...); return lockBuffer (attach_object_automatically); } @@ -159,11 +161,11 @@ namespace engine { * an instance of the template type embedded into the buffer * and destroying that embedded object when releasing the buffer. */ - template + template BufferDescriptor - BufferProvider::getDescriptor() + BufferProvider::getDescriptor (ARGS ...args) { - return getDescriptorFor (sizeof(BU), TypeHandler::create()); + return getDescriptorFor (sizeof(BU), TypeHandler::create (forward (args)...)); } diff --git a/src/steam/engine/connectivity-obsolete.hpp b/src/steam/engine/connectivity-obsolete.hpp index 7b1ca684b..0a9876a82 100644 --- a/src/steam/engine/connectivity-obsolete.hpp +++ b/src/steam/engine/connectivity-obsolete.hpp @@ -52,7 +52,6 @@ #include "steam/mobject/parameter.hpp" #include "steam/engine/state-closure-obsolete.hpp" /////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation #include "steam/engine/channel-descriptor.hpp" -#include "steam/engine/turnout-system.hpp" #include "lib/frameid.hpp" #include "lib/ref-array.hpp" @@ -71,13 +70,6 @@ namespace engine { typedef ProcNode* PNode; /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation - class Port - { - public: - virtual ~Port(); ///< this is an interface - - virtual TurnoutSystem enactTurnout() =0; - }; /** * Interface: Description of the input and output ports, diff --git a/src/steam/engine/feed-manifold.hpp b/src/steam/engine/feed-manifold.hpp index 33af4ff4a..8e3f46437 100644 --- a/src/steam/engine/feed-manifold.hpp +++ b/src/steam/engine/feed-manifold.hpp @@ -35,11 +35,10 @@ #include "lib/error.hpp" #include "lib/nocopy.hpp" -#include "steam/engine/channel-descriptor.hpp" #include "steam/engine/proc-node.hpp" +#include "lib/several.hpp" -#include -#include +//#include ////////////////////////////////TICKET #826 will be reworked alltogether @@ -61,134 +60,12 @@ namespace engine { * thus the array of real buffer pointers can be fed directly to the * processing function of the respective node. * - * @todo this whole design is a first attempt and rather clumsy. It should be reworked - * to use a single contiguous memory area and just layer the object structure on top - * (by using placement new). Yet the idea of an stack-like organisation should be retained + * @todo WIP-WIP-WIP 7/24 now reworking the old design in the light of actual render engine requirements... */ struct FeedManifold { - typedef BuffHandle * PHa; - typedef BuffHandle::PBuff * PBu; - typedef pair Chunk; - - PHa outHandle; - PHa inHandle; - PBu outBuff; - PBu inBuff; }; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : presumably obsolete - class BufferDescriptor; - - /** Obsolete, to be rewritten /////TICKET #826 */ - class BuffTableStorage - { - /////////////////////////////////////////////////////////////////////////TICKET #826 need to be reworked entirely - /** just a placeholder to decouple the existing code - * from the reworked BuffHandle logic. The existing - * code in turn will be reworked rather fundamentally - */ - struct BuffHaXXXX - : BuffHandle - { - BuffHaXXXX() : BuffHandle(just_satisfy_the_compiler()) { /* wont work ever */ } - static BufferDescriptor const& - just_satisfy_the_compiler() { } - }; - - ////////////////////////////////////TICKET #825 should be backed by mpool and integrated with node invocation - vector hTab_; - vector pTab_; - size_t level_; - - public: - BuffTableStorage (const size_t maxSiz) - : hTab_(maxSiz), - pTab_(maxSiz), - level_(0) - { } - - ~BuffTableStorage() { ASSERT (0==level_, "buffer management logic broken."); } - - protected: - - friend class BuffTableChunk; - - /** allocate the given number of slots - * starting at current level to be used - * by the newly created BuffTableChunk - */ - FeedManifold::Chunk - claim (uint slots) - { - ASSERT (pTab_.size() == hTab_.size()); - REQUIRE (level_+slots <= hTab_.size()); - - size_t prev_level (level_); - level_ += slots; - return std::make_pair (&hTab_[prev_level], - &pTab_[prev_level]); - } - - void - release (uint slots) - { - ASSERT (slots <= level_); - REQUIRE (level_ <= hTab_.size()); - REQUIRE (level_ <= pTab_.size()); - - level_ -= slots; - } - - bool - level_check (FeedManifold::Chunk& prev_level) - { - return prev_level.first == &hTab_[level_] - && prev_level.second == &pTab_[level_]; - } - }; - - - /** Obsolete, to be rewritten /////TICKET #826 - * to be allocated on the stack while evaluating a ProcNode#pull() call. - * The "current" State (StateProxy) maintains a BuffTableStorage (=pool), - * which can be used to crate such chunks. The claiming and releasing of - * slots in the BuffTableStorage is automatically tied to BuffTableChunk - * object's lifecycle. - */ - class BuffTableChunk - : public FeedManifold, - util::NonCopyable - { - const uint siz_; - FeedManifold::Chunk tab_; - BuffTableStorage& sto_; - - public: - BuffTableChunk (Connectivity const& wd, BuffTableStorage& storage) - : siz_(wd.nrI + wd.nrO), - tab_(storage.claim (siz_)), - sto_(storage) - { - const uint nrO(wd.nrO); - - // Setup the publicly visible table locations - this->outHandle = &tab_.first[ 0 ]; - this->inHandle = &tab_.first[nrO]; - this->outBuff = &tab_.second[ 0 ]; - this->inBuff = &tab_.second[nrO]; - } - - ~BuffTableChunk () - { - sto_.release (siz_); - ASSERT ( sto_.level_check (tab_), - "buffer management logic broken."); - } - }; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : (End)presumably obsolete - - }} // namespace steam::engine diff --git a/src/steam/engine/node-wiring-builder.hpp b/src/steam/engine/node-wiring-builder.hpp index 319c96d6b..c3bc81b71 100644 --- a/src/steam/engine/node-wiring-builder.hpp +++ b/src/steam/engine/node-wiring-builder.hpp @@ -42,10 +42,7 @@ #define ENGINE_NODE_WIRING_BUILDER_H -//#include "steam/engine/proc-node.hpp" //////////////////////////////////////////////////////////////////TICKET #1367 : switch to new Node Invocation scheme -#include "steam/engine/connectivity-obsolete.hpp" -#include "lib/ref-array.hpp" -#include "lib/util-foreach.hpp" +#include "steam/engine/proc-node.hpp" #include "lib/nocopy.hpp" @@ -53,137 +50,6 @@ namespace steam { namespace engine { - using lib::RefArray; - - - /** - * Finding out about a concrete way of wiring up a - * ProcNode about to be built. Such a (temporary) setup object - * is used while building the low-level model. It is loaded with - * information concerning the intended connections to be made - * and then used to initialise the wiring descriptor, which - * in turn allows us to setup the ProcNode. - * - * \par intended usage pattern - * The goal is to describe the constellation of a new node to be built. - * Thus, we start with one or several existing nodes, specifying which - * output should go to which input pin of the yet-to-be created new node. - * When intending to create a source node, a default WiringSituation - * should be used, without adding any connection information. - * - * @deprecated WIP-WIP-WIP 2024 Node-Invocation is reworked from ground up for the »Playback Vertical Slice« - */ - class WiringSituation - : util::NonCopyable - { - long flags_; - asset::Proc::ProcFunc* function_; - - public: /* === API for querying collected data === */ - RefArray& - makeOutDescriptor() const - { - UNIMPLEMENTED ("build new output descriptors for the node under construction"); //////////TODO: where to get the information about the output channels??? - } - - RefArray& - makeInDescriptor() const - { - UNIMPLEMENTED ("build new input descriptors for the node under construction"); - } - - Connectivity::ProcFunc* - resolveProcessingFunction() const - { - REQUIRE (function_); - return function_; - } - - lumiera::NodeID const& - createNodeID() const - { - UNIMPLEMENTED ("initiate generation of a new unique node-ID"); // see rendergraph.cpp - } - - - - public: /* === API for specifying the desired wiring === */ - - /** A default WiringSituation doesn't specify any connections. - * It can be used as-is for building a source node, or augmented - * with connection information later on. - */ - WiringSituation() - : flags_(0) - , function_(0) - { - UNIMPLEMENTED ("representation of the intended wiring"); - } - - - /** Continue the wiring by hooking directly into the output - * of an existing predecessor node - */ - WiringSituation (PNode predecessor) - : flags_(0) - , function_(0) - { - UNIMPLEMENTED ("wiring representation; hook up connections 1:1"); - REQUIRE (predecessor); - - //////////////////////////TODO: see Ticket 254 - // for_each (predecessor->outputs(), ..... see also Ticket 183 (invoking member fun in for_each) - - } - - - /** set up a connection leading to a specific input pin of the new node */ - WiringSituation& - defineInput (uint inPin, PNode pred, uint outPin) - { - UNIMPLEMENTED ("wiring representation; define new connection"); - return *this; - } - - /** set up the next input connection, - * originating at a specific output pin of the predecessor */ - WiringSituation& - defineInput (PNode pred, uint outPin) - { - UNIMPLEMENTED ("wiring representation; define new connection"); - return *this; - } - - /** set up the next input connection to a specific input pin, - * originating at a the next/sole output pin of the predecessor */ - WiringSituation& - defineInput (uint inPin, PNode pred) - { - UNIMPLEMENTED ("wiring representation; define new connection"); - return *this; - } - - - /** set detail flags regarding the desired node operation mode */ - WiringSituation& - setFlag (long code) - { - flags_ |= code; - return *this; - } - - long getFlags () const { return flags_; } - - - /** trigger resolving of the actual processing function */ - WiringSituation& - resolveProcessor (asset::Proc const& procAsset) - { - function_ = procAsset.resolveProcessor(); - ENSURE (function_); - } - - }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation class NodeWiringBuilder @@ -194,8 +60,7 @@ namespace engine { /****************************************************//** * Terminal: complete the Connectivity defined thus far. */ -// Connectivity - void* /////////////////////////////////////////////////OOO Connectivity no longer needs to be abstract + Connectivity build() { UNIMPLEMENTED("Node-Connectivity Setup"); @@ -211,6 +76,7 @@ namespace engine { buildPatternFor() { UNIMPLEMENTED("instantiate Domain Ontology Facade and outfit the NodeWiringBuilder"); + return NodeWiringBuilder{}; } diff --git a/src/steam/engine/nodewiring-obsolete.hpp b/src/steam/engine/nodewiring-obsolete.hpp index 633782d8a..aade4705b 100644 --- a/src/steam/engine/nodewiring-obsolete.hpp +++ b/src/steam/engine/nodewiring-obsolete.hpp @@ -33,9 +33,7 @@ #define ENGINE_NODEWIRING_OBSOLETE_H -//#include "steam/engine/proc-node.hpp" ///////////////////////////////TODO clarify if required further on #include "steam/engine/connectivity-obsolete.hpp" -#include "steam/engine/node-wiring-builder.hpp" #include "lib/allocation-cluster.hpp" #include "lib/ref-array.hpp" #include "lib/util-foreach.hpp" @@ -53,9 +51,141 @@ namespace engine { namespace config { class WiringFactoryImpl; } +/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : inlined here and then dropped in node-wiring-builder.hpp using lib::RefArray; + /** + * Finding out about a concrete way of wiring up a + * ProcNode about to be built. Such a (temporary) setup object + * is used while building the low-level model. It is loaded with + * information concerning the intended connections to be made + * and then used to initialise the wiring descriptor, which + * in turn allows us to setup the ProcNode. + * + * \par intended usage pattern + * The goal is to describe the constellation of a new node to be built. + * Thus, we start with one or several existing nodes, specifying which + * output should go to which input pin of the yet-to-be created new node. + * When intending to create a source node, a default WiringSituation + * should be used, without adding any connection information. + * + * @deprecated WIP-WIP-WIP 2024 Node-Invocation is reworked from ground up for the »Playback Vertical Slice« + */ + class WiringSituation + : util::NonCopyable + { + long flags_; + asset::Proc::ProcFunc* function_; + + public: /* === API for querying collected data === */ + RefArray& + makeOutDescriptor() const + { + UNIMPLEMENTED ("build new output descriptors for the node under construction"); //////////TODO: where to get the information about the output channels??? + } + + RefArray& + makeInDescriptor() const + { + UNIMPLEMENTED ("build new input descriptors for the node under construction"); + } + + Connectivity::ProcFunc* + resolveProcessingFunction() const + { + REQUIRE (function_); + return function_; + } + + lumiera::NodeID const& + createNodeID() const + { + UNIMPLEMENTED ("initiate generation of a new unique node-ID"); // see rendergraph.cpp + } + + + + public: /* === API for specifying the desired wiring === */ + + /** A default WiringSituation doesn't specify any connections. + * It can be used as-is for building a source node, or augmented + * with connection information later on. + */ + WiringSituation() + : flags_(0) + , function_(0) + { + UNIMPLEMENTED ("representation of the intended wiring"); + } + + + /** Continue the wiring by hooking directly into the output + * of an existing predecessor node + */ + WiringSituation (PNode predecessor) + : flags_(0) + , function_(0) + { + UNIMPLEMENTED ("wiring representation; hook up connections 1:1"); + REQUIRE (predecessor); + + //////////////////////////TODO: see Ticket 254 + // for_each (predecessor->outputs(), ..... see also Ticket 183 (invoking member fun in for_each) + + } + + + /** set up a connection leading to a specific input pin of the new node */ + WiringSituation& + defineInput (uint inPin, PNode pred, uint outPin) + { + UNIMPLEMENTED ("wiring representation; define new connection"); + return *this; + } + + /** set up the next input connection, + * originating at a specific output pin of the predecessor */ + WiringSituation& + defineInput (PNode pred, uint outPin) + { + UNIMPLEMENTED ("wiring representation; define new connection"); + return *this; + } + + /** set up the next input connection to a specific input pin, + * originating at a the next/sole output pin of the predecessor */ + WiringSituation& + defineInput (uint inPin, PNode pred) + { + UNIMPLEMENTED ("wiring representation; define new connection"); + return *this; + } + + + /** set detail flags regarding the desired node operation mode */ + WiringSituation& + setFlag (long code) + { + flags_ |= code; + return *this; + } + + long getFlags () const { return flags_; } + + + /** trigger resolving of the actual processing function */ + WiringSituation& + resolveProcessor (asset::Proc const& procAsset) + { + function_ = procAsset.resolveProcessor(); + ENSURE (function_); + } + + }; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : (END)inlined here and then dropped in node-wiring-builder.hpp + + /** diff --git a/src/steam/engine/proc-node.hpp b/src/steam/engine/proc-node.hpp index b8f1c11a4..c449faaf7 100644 --- a/src/steam/engine/proc-node.hpp +++ b/src/steam/engine/proc-node.hpp @@ -51,7 +51,8 @@ #include "steam/engine/channel-descriptor.hpp" #include "steam/engine/turnout-system.hpp" #include "lib/frameid.hpp" -#include "lib/ref-array.hpp" +#include "lib/ref-array.hpp" /////////////////////OOO phase out +#include "lib/several.hpp" #include diff --git a/src/steam/engine/turnout.hpp b/src/steam/engine/turnout.hpp index 387304a00..8245213e9 100644 --- a/src/steam/engine/turnout.hpp +++ b/src/steam/engine/turnout.hpp @@ -59,11 +59,11 @@ #ifndef STEAM_ENGINE_TURNOUT_H #define STEAM_ENGINE_TURNOUT_H -#include #include "steam/common.hpp" #include "steam/engine/proc-node.hpp" #include "steam/engine/turnout-system.hpp" #include "steam/engine/feed-manifold.hpp" +#include "steam/engine/state-closure.hpp" /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation #include "steam/engine/channel-descriptor.hpp" //#include "vault/gear/job.h" diff --git a/src/steam/engine/type-handler.hpp b/src/steam/engine/type-handler.hpp index 0eae6666f..1802a32c3 100644 --- a/src/steam/engine/type-handler.hpp +++ b/src/steam/engine/type-handler.hpp @@ -45,6 +45,7 @@ #include "lib/error.hpp" #include "lib/hash-value.h" +#include #include #include @@ -54,6 +55,7 @@ namespace engine { using lib::HashVal; using std::bind; + using std::forward; using std::function; using std::placeholders::_1; @@ -62,18 +64,11 @@ namespace engine { namespace { // (optional) helpers to build an object embedded into a buffer... - template + template inline void - buildIntoBuffer (void* storageBuffer) + buildIntoBuffer (void* storageBuffer, ARGS&& ...args) { - new(storageBuffer) X(); - } - - template - inline void - buildIntoBuffer_A1 (void* storageBuffer, A1 arg1) - { - new(storageBuffer) X(arg1); + new(storageBuffer) X(forward (args)...); } template @@ -145,20 +140,13 @@ namespace engine { { } /** builder function defining a TypeHandler - * to place a default-constructed object - * into the buffer. */ - template + * to place an object into the buffer, + * possibly with given ctor arguments. */ + template static TypeHandler - create () + create (ARGS&& ...args) { - return TypeHandler (buildIntoBuffer, destroyInBuffer); - } - - template - static TypeHandler - create (A1 a1) - { - return TypeHandler ( bind (buildIntoBuffer_A1, _1, a1) + return TypeHandler ( bind (buildIntoBuffer, _1, forward (args)...) , destroyInBuffer); } diff --git a/tests/core/steam/engine/feed-manifold-test.cpp b/tests/core/steam/engine/feed-manifold-test.cpp index 75349d6c6..855c04b02 100644 --- a/tests/core/steam/engine/feed-manifold-test.cpp +++ b/tests/core/steam/engine/feed-manifold-test.cpp @@ -135,25 +135,27 @@ namespace test { */ class FeedManifold_test : public Test { +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #852 using PSto = std::unique_ptr; PSto pStorage; +#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #852 ulong counter; virtual void run(Arg) { counter = 0; +#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #852 // allocate storage block to be used chunk wise pStorage.reset (new BuffTableStorage (TABLE_SIZ)); -#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #852 invocation (0, detect_start_level(*pStorage)); -#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #852 pStorage.reset(0); // dtor throws assertion error if corrupted cout << "BuffTable chunks allocated: "<() + .build(); + UNIMPLEMENTED ("build render nodes linked into a connectivity network"); + } + + + /** @test TODO Use existing node connectivity to generate a TurnoutSystem + * @todo WIP 7/24 🔁 define ⟶ implement + */ + void + generate_turnout_system() + { + UNIMPLEMENTED ("use existing node connectivity to generate a TurnoutSystem"); + } + + + /** @test TODO Invoke some render nodes as linked together + * @todo WIP 7/24 🔁 define ⟶ implement + */ + void + trigger_node_port_invocation() { UNIMPLEMENTED ("operate some render nodes as linked together"); - } + } }; diff --git a/tests/core/steam/engine/test-rand-ontology.hpp b/tests/core/steam/engine/test-rand-ontology.hpp new file mode 100644 index 000000000..fcbfe3f17 --- /dev/null +++ b/tests/core/steam/engine/test-rand-ontology.hpp @@ -0,0 +1,66 @@ +/* + TEST-RAND-ONTOLOGY.hpp - placeholder for a domain-ontology working on dummy data frames + + Copyright (C) Lumiera.org + 2024, Hermann Vosseler + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/** @file testframe-rand-ontology.hpp + ** A faked »media calculation« environment to validate the render node network. + */ + + +#ifndef STEAM_ENGINE_TEST_RAND_ONTOLOGY_H +#define STEAM_ENGINE_TEST_RAND_ONTOLOGY_H + + +#include "steam/engine/testframe.hpp" + + +namespace steam { +namespace engine{ +namespace test { + + + /** + * A fake _Domain Ontology_ to describe mocked »render operations« on + * dummy data frames filled with random numbers. + * + * @see TestFrame_test + * @see NodeDevel_test + * @see NodeLinkage_test + * + */ + class TestRandOntology + { + + public: + ~TestRandOntology() = default; + TestRandOntology() = default; + + private: + }; + + + + /** */ + + + +}}} // namespace steam::engine::test +#endif diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index c672ab7fd..39e14e3c9 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -80043,9 +80043,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

...für den »Playback Vertical Slice« wird eine Fixture fabriziert, wie sie vermutlich später mal vom Builder produziert werden wird (wenn es ihn dann endlich mal gibt) — tatsächlich sehe ich das als ersten prototypischen Entwurf, den ich hier nebenbei aus einer bottom-up-Bewegung gewinnen kann @@ -80444,16 +80442,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

beachte: dieser »eine Frame« kann durchaus noch inhärent strukturiert sein, beispielsweise mehrere Planes für ein planares Format enthalten oder ein Interleaved-Zyklus von Einzelframes für zusammengehörige Kanäle sein — entscheidend ist, daß dieses Datenelement jeweils als EInheit verwendet und zusammen produziert oder konsumiert wird.

- -
+
@@ -80720,6 +80715,22 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + +

+ erste Rohentwürfe +

+

+ +Basis-Implementation +

+ +
+ + + +
@@ -81400,22 +81411,17 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

aber erwartungsgemäß hat man das eben grade nicht

- -
+
- - - +

...sondern nur einen lokalen Kontext @@ -81439,23 +81445,18 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

...und ich kann mich erinnern, daß ich sie auch damals nicht vestanden habe, sondern mich immer nur von Definition zu Definition hangelte...

- -
+
- - - +

das ist die gradezu klassische »Top-down«-Falle: @@ -81472,8 +81473,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + @@ -81485,13 +81485,15 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + @@ -81500,18 +81502,22 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + - + + - + + - + + + @@ -81519,8 +81525,179 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ dieser speichert einen HashVal subClassification_ +

+ + +
+
+ + + + + + + + + + + + +

+ siehe type-handler.hpp +

+ + +
+
+ + + + +

+ dieser zielt darauf ab, Strukturen in den Buffer zu pflanzen +

+ + +
+
+
+ + + + + + + + + + + + + + + + + + +

+ und dieser gehört zu einer DomainOntology +

+ +
+
+ + + + +
+
+
+ + + + + + + + + + + + + + + + + + +

+ Konsequenz ⟹ die Spec legt fest was in den Buffer gelegt wird +

+ + +
+ + + + + + + + + + + +

+ leider setzt das bereits die Domain-Ontology vorraus +

+ +
+ + + + + + + + + + + + + + + + + +

+ ...und zur Laufzeit wird nur noch ein Stück von diesem »was« angefordert +

+ + +
+
+
+
+
+ + + + + @@ -81530,8 +81707,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + + @@ -85215,12 +85393,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- +

- man geht von ProcNode durch Connectivity, dann NodeWiring ... und wenn man Glück hat, fällt einem der Header nodeoperaton.hpp auf...  ⚠ denn sonst ist der tatsächliche Einstiegspunkt mit üblichen Methoden der Code-Suche praktisch nicht zu finden: Er steckt in nodewiring.hpp in der konkreten Definition der virtuellen Funktion callDown()  — und von dort in eine dependent Method thisStep.retrieve(), die tatsächlich im Template ActualInvocationProcess an STRATEGY::step()  weitergereicht wird — und vermutlich ist nur mir klar, daß damit die verketteten step()-Methoden in nodeoperation.hpp gemeint sind... + man geht von ProcNode durch Connectivity, dann NodeWiring ... und wenn man Glück hat, fällt einem der Header nodeoperation.hpp  auf...  ⚠ denn sonst ist der tatsächliche Einstiegspunkt mit üblichen Methoden der Code-Suche praktisch nicht zu finden: Er steckt in nodewiring.hpp in der konkreten Definition der virtuellen Funktion callDown()  — und von dort in eine dependent Method thisStep.retrieve(), die tatsächlich im Template ActualInvocationProcess an STRATEGY::step()  weitergereicht wird — und vermutlich ist nur mir klar, daß damit die verketteten step()-Methoden in nodeoperation.hpp  gemeint sind...

@@ -85313,11 +85491,22 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + - - - + + + + + + + + + + + + + @@ -85487,6 +85676,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ @@ -85494,9 +85684,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ - + @@ -85522,9 +85713,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

...und zwar mit einer Gruppierung der Buffer nach Größe, und vermutlich auch pro Thread @@ -85543,16 +85732,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

Es kann durchaus sein, daß das jeweilige Output-System einzelne Teil-Kanäle in einem planaren Format haben möchte, also als einzelne, zusammenhängende Datenblöcke für jeden Kanal (Hue, Sat, Lum, bzw. Sound-L/R oder WXYZ...)

- -
+
@@ -85566,12 +85752,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + - + @@ -85583,23 +85770,25 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

warum? weil es die BufferManager-Abstraktion unterläuft

- -
+
- + + + + + +
@@ -85633,10 +85822,34 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + +

+ Auf der Ebene der Implementierung ist die Domain-Ontology so etwas wie eine Typklasse — wie bildet man das in C++17 ab — und wie in C++20 ? +

+ +
+ +
+ + + + + + + + + + - + @@ -85659,8 +85872,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + + + + + + + @@ -85685,7 +85904,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + + + + + + @@ -85779,16 +86003,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - - +

...weiterhin bleibt es dabei, daß der Zugang zum Buffer-Management über das Turnout-System (früher StateAdapter) läuft; aber dafür ist kein klassisches OO-Interface notwendig, sofern das Buffer-Handling seinerseits auf einem Interface aufbaut. Die Aufgabe, an der sich das entscheidet ist, wie der konkrete Turnout eine konkrete FeedManifold bauen kann (und ob er das überhaupt tut)

- -
+
@@ -124838,6 +125059,10 @@ std::cout << tmpl.render({"what", "World"}) << s + + + +