diff --git a/src/steam/engine/buffer-proxy-adaptor.hpp b/src/steam/engine/buffer-proxy-adaptor.hpp index d7c129172..3b3df85e8 100644 --- a/src/steam/engine/buffer-proxy-adaptor.hpp +++ b/src/steam/engine/buffer-proxy-adaptor.hpp @@ -71,19 +71,10 @@ namespace engine { : util::NonCopyable { - class PreRiggedBufferStage - : public SimpleBufferStateRegistry - { - public: - PreRiggedBufferStage() - : SimpleBufferStateRegistry{"ResourceProxy"} - { } - }; - class ProxyBufferStore : public BufferProviderSetup::Store + , private CONF { - CONF& callback_; Buff* asBuffer (LocalTag targetMarker) @@ -103,35 +94,41 @@ namespace engine { Slot provideBuffer (size_t,HashVal, LocalTag targetMarker) override { - callback_.on_lock(); + CONF::on_lock(); return {asBuffer(targetMarker), targetMarker}; } void mark_emitted (size_t,HashVal, LocalTag const&) override { - callback_.on_emit(); + CONF::on_emit(); } void detachBuffer (size_t,HashVal,Slot) override { - callback_.on_release(); + CONF::on_release(); } public: - ProxyBufferStore (CONF& policy) - : callback_{policy} + ProxyBufferStore (CONF policy) + : CONF{move(policy)} { } }; + struct Setup + : CONF + { + auto buildStage() { return std::make_unique("ResourceProxy"); } + auto buildStore() { return std::make_unique (move(*this)); } + }; // Note: possible since Setup does not use CONF + class PassThroughBufferProvider : public BufferProviderSetup { public: - template - PassThroughBufferProvider (SETUP& setup) + PassThroughBufferProvider (Setup setup) : BufferProviderSetup{setup} { } @@ -145,21 +142,12 @@ namespace engine { } }; - struct Setup - : CONF - { - auto buildStage() { return std::make_unique(); } - auto buildStore() { return std::make_unique(*this); } - }; - Setup setup_; - PassThroughBufferProvider proxyProvider_; public: BufferProxyAdaptor(CONF policy) - : setup_{move(policy)} - , proxyProvider_{setup_} + : proxyProvider_{Setup{move(policy)}} { } template diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index d5392f253..1627b3111 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -114431,6 +114431,72 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension) + + + + + + + + +

+ Das ist so vorgegeben durch das Design von BufferProviderSetup (weil ich damit die konkreten Backend-Klassen komplett aus dem Basis-Interface BufferProvider heraushalte) +

+ + +
+
+ + + + + + +

+ BufferProviderSetup ruft aus dem Rumpf ihres Konstruktors zwei Setup-Methoden auf; das wars dann, danach wird die Setup-Klasse nicht mehr gebraucht +

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

+ Hier wird's dreist: Policy-Base per move aus der Setup-Hilfsklasse herausschieben !!! +

+ + +
+ + + + + +

+ Und zwar, noch dreister, während diese Setup-Klasse grade aufgerufen wird, um die Backends zu konfigurieren. Effektiv führt dieser Aufruf dazu, daß die Setup-Klasse ihre eigenen »Eingeweide« ausweidet und weitergibt. Kein Problem, sie stirbt ja sowiso am Ende des Aufrufts. +

+

+ +

+

+ Noch genauer betrachtet: eine RValue-Referenz ist ja erst mal nur ein »Angebot«: sie macht etwas für move-Konstukrion (oder Zuweisung) zugänglich. Was konkret beim »move« passiert, legt der Konsument fest. Hier ist der Konsument aber tatsächlich nur an der Basis-Klasse interessiert, d.h. er konstruiert eine Kopie der Basisklasse per move-Konstruktur. Und wiederum, was dabei passiert, bestimmen die Member in dieser Policy. Erwartungsgemäß sind das Lambdas, und die könnten obtional tatsächlich etwas binden, was dann per Move-Konstruktion verschoben wird (z.B. einenen unique-PImpl). Sehr schön, denn Lambdas werden erst aktiv, wenn sie aufgerufen werden. Werden sie aber nicht, während der Konstruktion. Zusammengefaßt: solange nicht der Konstruktionsvorgang selbst die Callbacks aufruft, ist das alles wasserdicht. Die einzige (langfristige) Gefahr besteht darin, daß ein übereifriger Linter/Compiler in Zukunft hier einen use-after-delete markiert, ohne tatsächlich zu belegen, daß der use auftritt. +

+ + +
+
+