From bb9d0107cd2a07a277fe1eacc1c0df168ec82510 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 12 Oct 2024 04:17:39 +0200 Subject: [PATCH] Invocation: setup preliminary engine-context * decision how to provide a default service for tests while also allow for configuration of more specific services * as starting point for the prototype: use the `TrackingHeapBlockProvider` (simply because this is the only implementation available and tested) --- src/steam/engine/engine-ctx-facilities.cpp | 17 ++- src/steam/engine/engine-ctx-facilities.hpp | 25 +++- src/steam/engine/engine-ctx.hpp | 7 +- src/steam/engine/weaving-pattern-builder.hpp | 11 +- wiki/thinkPad.ichthyo.mm | 120 +++++++++++++------ 5 files changed, 126 insertions(+), 54 deletions(-) diff --git a/src/steam/engine/engine-ctx-facilities.cpp b/src/steam/engine/engine-ctx-facilities.cpp index ccf28e980..fe0bb61d6 100644 --- a/src/steam/engine/engine-ctx-facilities.cpp +++ b/src/steam/engine/engine-ctx-facilities.cpp @@ -28,6 +28,7 @@ #include "steam/engine/engine-ctx-facilities.hpp" +#include "steam/engine/tracking-heap-block-provider.hpp" //#include //#include @@ -42,14 +43,12 @@ namespace engine{ // using lumiera::Subsys; // using std::function; // using std::bind; + using std::make_unique; // using std::ref; namespace { // hidden local details of the service implementation.... -/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Temp Placeholder - BufferProvider* kabooom{nullptr}; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Temp Placeholder } // (End) hidden service impl details @@ -63,8 +62,16 @@ namespace engine{ /** */ EngineCtx::EngineCtx() - : mem{*kabooom} - , cache{*kabooom} + : services_{make_unique()} + , mem {services_->getMemProvider()} + , cache{services_->getCacheProvider()} + { } + + + /** */ + EngineCtx::Facilities::Facilities() + : memProvider_{make_unique()} ////////////////////////////////////////TICKET #1367 : only suitable for first prototype + , cacheProvider_{} { } diff --git a/src/steam/engine/engine-ctx-facilities.hpp b/src/steam/engine/engine-ctx-facilities.hpp index 5b404bae7..edb5456c8 100644 --- a/src/steam/engine/engine-ctx-facilities.hpp +++ b/src/steam/engine/engine-ctx-facilities.hpp @@ -39,21 +39,42 @@ #include "steam/engine/engine-ctx.hpp" +#include "steam/engine/buffer-provider.hpp" +#include "lib/nocopy.hpp" //#include -//#include +#include namespace steam { namespace engine { // using lib::Literal; -// using std::unique_ptr; + using std::unique_ptr; // using std::forward; class EngineCtx::Facilities + : util::NonCopyable { + unique_ptr memProvider_; + unique_ptr cacheProvider_; + public: + Facilities(); + + BufferProvider& + getMemProvider() + { + REQUIRE (memProvider_); + return *memProvider_; + } + + BufferProvider& + getCacheProvider() + { + return cacheProvider_? *cacheProvider_ + : *memProvider_; + } }; diff --git a/src/steam/engine/engine-ctx.hpp b/src/steam/engine/engine-ctx.hpp index 24faf1f89..ce25f0505 100644 --- a/src/steam/engine/engine-ctx.hpp +++ b/src/steam/engine/engine-ctx.hpp @@ -46,7 +46,7 @@ #include "lib/nocopy.hpp" //#include -//#include +#include namespace steam { @@ -59,13 +59,14 @@ namespace engine { class EngineCtx : util::NonCopyable { + class Facilities; + std::unique_ptr services_; + public: BufferProvider& mem; BufferProvider& cache; // BufferProvider& output; /////////////////////////OOO presumably no longer necessary - class Facilities; - static lib::Depend access; private: diff --git a/src/steam/engine/weaving-pattern-builder.hpp b/src/steam/engine/weaving-pattern-builder.hpp index f912e6cba..83b50af64 100644 --- a/src/steam/engine/weaving-pattern-builder.hpp +++ b/src/steam/engine/weaving-pattern-builder.hpp @@ -60,6 +60,7 @@ namespace engine { using std::forward; using lib::Several; + using lib::Depend; namespace {// Introspection helpers.... @@ -230,13 +231,7 @@ namespace engine { uint resultSlot{0}; - struct ServiceCtx - { - ProviderRef mem; - ProviderRef cache; - ProviderRef output; - }; - ServiceCtx ctx; //////////////////////////////////////////OOO need to wire that top-down through all builders! + Depend ctx; FUN fun_; @@ -294,7 +289,7 @@ namespace engine { maybeFillDefaultProviders (size_t maxSlots) { for (uint i=providers.size(); i < maxSlots; ++i) - providers.emplace_back (ctx.mem); + providers.emplace_back (ctx().mem); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : (End)Prototyping: how to assemble a Turnout diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 9199571ed..5e86cdb5f 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -7800,9 +7800,7 @@ - - - +

nämlich wenn der Pfad mit einem explizit gegebenen Präfix anfängt, @@ -7815,9 +7813,7 @@ - - - +

beispielsweise @@ -7847,9 +7843,7 @@ - - - +

letzten Endes war es nahezu gleich schwer zu implementieren, @@ -7888,9 +7882,7 @@ - - - +

wo der Spot ist @@ -7962,9 +7954,7 @@ - - - +

die Topologie, aber auch der Fokus-Zustand @@ -8402,9 +8392,7 @@ - - - +

das Fortschreiten der Berechnung dargestellt werden kann @@ -8865,9 +8853,7 @@ - - - +

aber eine falsche Template-Instantiierung @@ -10471,9 +10457,7 @@ - - - +

...weil man den konkreten Typ der Core kennen muß @@ -12891,9 +12875,7 @@ - - - +

...weil die Perspektive eigentlich als etwas Orthogonales empfunden wird, @@ -16968,9 +16950,7 @@ - - - +

Problem: Zusammenarbeit @@ -88597,8 +88577,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
nein! jetzt direkt im Aufruf gelöst

- -
+
@@ -88623,8 +88602,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
ja: ist problematisch — und genau deshalb ziehe ich jetzt vor, den Output-Buffer direkt über den Aufruf bereitzustellen; dieser Aspekt spielt damit für das Thema Dependency-Injection keine Rolle mehr

- - + @@ -89146,8 +89124,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
...es ist zwar gut, daß es das LocalTag gibt, aber für diesen Fall ist das eine unsinnige Trickserei; es ist viel besser, an der einzigen Stelle, wo das benötigt wird (nämlich auf top-Level) explizit eine Flag zu setzen und dann den Buffer zu entnehmen

- -
+
@@ -89221,11 +89198,82 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + +

+ Die Indirektion ist nur notwendig, wenn es einen für den Benutzer sichtbaren Lebenszyklus-Zustand gibt; andernfalls gilt es lediglich als Service-Konfiguration und der Client kann sich direkte Referenzen für die verwendeten Services ziehen +

+ + +
+
+ + + + +

+ Denn nicht die Render-Engine hat einen Lebenszyklus, sondern das Core-System; die Abhängikeiten kaskadieren ausgehend von der Subsystem-Facade. Das bedeutet, sofern man überhaupt Zugang zu einer Core-Engine hat, ist diese bereits fertig konfiguriert und bleibt auch so; ein Austauschen oder Neustarten der Engine wird nicht vorgesehen. Mithin spielt diese Indirektion keine Rolle, denn die Verwendungen im low-level-Model können sich direkte Service-Referenzen ziehen; die Flexibilität wird lediglich für Applikations-Konfiguration und für das Testen benötigt +

+ +
+
+
+ + + + +

+ und zwar liegt die Indirektion hier in der VTable und ist damit bei jeder Verwendung wirksam +

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

+ da es offensichtlicher ist, und zwischen Konstruktor und den von diesem erzeugten Services keine architektonische Trennung besteht +

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