diff --git a/src/steam/engine/feed-manifold.hpp b/src/steam/engine/feed-manifold.hpp
index 5e0751caa..4f69f3897 100644
--- a/src/steam/engine/feed-manifold.hpp
+++ b/src/steam/engine/feed-manifold.hpp
@@ -605,6 +605,9 @@ namespace engine {
template
using Adapted = FeedPrototype;
+ template
+ using Decorated = FeedPrototype;
+
/** is the given functor suitable as parameter functor for this Feed? */
template
static constexpr bool isSuitable()
@@ -623,12 +626,20 @@ namespace engine {
*/
template
auto
- moveAdapted (PFX otherParamFun =PFX{})
+ moveAdaptedParam (PFX otherParamFun =PFX{})
{
using OtherParamFun = std::decay_t;
return Adapted{move(procFun_), move(otherParamFun)};
}
+ template
+ auto
+ moveDecoratedProc (DEC procFunDecorator)
+ {
+ using AugmentedProcFun = std::decay_t;
+ return Decorated{procFunDecorator (move(procFun_)), move(paramFun_)};
+ }
+
/** build a clone-copy of this prototype, holding the same functors
* @note possible only if both proc-functor and param-functor are copyable
diff --git a/src/steam/engine/node-builder.hpp b/src/steam/engine/node-builder.hpp
index df24d6906..d1f255553 100644
--- a/src/steam/engine/node-builder.hpp
+++ b/src/steam/engine/node-builder.hpp
@@ -477,6 +477,18 @@ namespace engine {
});
}
+ template
+ auto
+ adaptParam (ADA&& paramAdaptor)
+ {
+ using DecoratedPrototype = typename WAB::template Decorated;
+ using AdaptedPortBuilder = PortBuilder;
+ //
+ return AdaptedPortBuilder{move(*this)
+ ,weavingBuilder_.adaptProcFunParam (move (paramAdaptor))
+ };
+ }
+
/*************************************************************//**
diff --git a/src/steam/engine/weaving-pattern-builder.hpp b/src/steam/engine/weaving-pattern-builder.hpp
index 8cbeb2fb0..d43744d23 100644
--- a/src/steam/engine/weaving-pattern-builder.hpp
+++ b/src/steam/engine/weaving-pattern-builder.hpp
@@ -294,7 +294,12 @@ namespace engine {
using AdaptedPrototype = typename PROT::template Adapted;
template
using Adapted = WeavingBuilder>;
-
+
+ template
+ using DecoratedPrototype = typename PROT::template Decorated;
+ template
+ using Decorated = WeavingBuilder>;
+
/** Adapt a parameter-functor into the _Feed Prototype,_
* so that it is invoked whenever a new `FeedManifold` is built.
* @return adapted WeavingBuilder marked with changed `FeedManifold` type.
@@ -309,7 +314,23 @@ namespace engine {
using AdaptedWeavingBuilder = Adapted;
//
return AdaptedWeavingBuilder{move(*this)
- ,prototype_.moveAdapted (move (paramFunctor))
+ ,prototype_.moveAdaptedParam (move (paramFunctor))
+ };
+ }
+
+ /** @todo */
+ template
+ auto
+ adaptProcFunParam (DEC decorator)
+ {
+// static_assert (PROT::template isSuitable()
+// ,"suitable as param-functor for given processing-functor"); //////////////////////////TODO
+ //
+ using AdaptedWeavingBuilder = Decorated;
+ //
+ return AdaptedWeavingBuilder{move(*this)
+ ,prototype_.moveDecoratedProc (move (decorator))
+ //////////////////////////////////////////////////////////////////////OOO need to do the actual adaptation here
};
}
diff --git a/tests/core/steam/engine/node-base-test.cpp b/tests/core/steam/engine/node-base-test.cpp
index 1319232bf..824d008ca 100644
--- a/tests/core/steam/engine/node-base-test.cpp
+++ b/tests/core/steam/engine/node-base-test.cpp
@@ -370,7 +370,7 @@ namespace test {
CHECK ( P1x::hasParamFun());
CHECK (not P1x::canActivate());
- P1x p1x = p1.moveAdapted (move(fun_paramSimple));
+ P1x p1x = p1.moveAdaptedParam (move(fun_paramSimple));
M1 m1x = p1x.buildFeed(turSys); // ◁————————— param-functor invoked here
CHECK (rr == m1x.param); // ...as indicated by the side-effect
short r1 = m1x.param;
@@ -413,7 +413,7 @@ namespace test {
CHECK ( P1F::canActivate());
P1F p1f = p1x.clone() // if (and only if) the embedded functors allow clone-copy
- .moveAdapted(); // then we can fork-off and then adapt a cloned prototype
+ .moveAdaptedParam(); // then we can fork-off and then adapt a cloned prototype
// Need to distinguish between static capability and runtime state...
CHECK (not p1 .canActivate()); // Case-1 had no param functor installed...
diff --git a/tests/core/steam/engine/node-builder-test.cpp b/tests/core/steam/engine/node-builder-test.cpp
index 66e9b5101..ee98a3384 100644
--- a/tests/core/steam/engine/node-builder-test.cpp
+++ b/tests/core/steam/engine/node-builder-test.cpp
@@ -26,6 +26,7 @@
#include "lib/symbol.hpp"
#include
+#include
using lib::Symbol;
using std::string;
@@ -60,6 +61,7 @@ namespace test {
build_simpleNode();
build_Node_fixedParam();
build_Node_dynamicParam();
+ build_Node_adaptedParam();
build_connectedNodes();
build_ParamNode();
}
@@ -164,6 +166,28 @@ namespace test {
}
+ /** @test build a node and _adapt the parameters_ for invocation.
+ * - again use a processing function which takes a parameter
+ * - but then _decorate_ this functor, so that it takes different arguments
+ * - attach parameter handling to supply these adapted arguments
+ * @todo 2/25 ✔ define ⟶ 🔁 implement
+ */
+ void
+ build_Node_adaptedParam()
+ {
+ auto procFun = [](ulong param, int* buff){ *buff = int(param); };
+ auto adaptor = [](string const& spec){ return boost::lexical_cast(spec); };
+
+ ProcNode node{prepareNode("Test")
+ .preparePort()
+ .invoke ("fun()", procFun)
+// .adaptParam (adaptor) /////////////////////OOO engage here!
+// .setParam ("55")
+ .completePort()
+ .build()};
+ }
+
+
/** @test build a chain with three connected Nodes
* - have two source nodes, which accept a parameter
* - but configure them differently: one gets a constant,
diff --git a/tests/core/steam/engine/node-devel-test.cpp b/tests/core/steam/engine/node-devel-test.cpp
index 00f642520..f6c30d5e0 100644
--- a/tests/core/steam/engine/node-devel-test.cpp
+++ b/tests/core/steam/engine/node-devel-test.cpp
@@ -22,10 +22,8 @@
#include "steam/engine/node-builder.hpp"
#include "steam/engine/test-rand-ontology.hpp"
#include "steam/engine/diagnostic-buffer-provider.hpp"
-#include "lib/test/diagnostic-output.hpp"/////////////////TODO
#include "lib/iter-zip.hpp"
#include "lib/random.hpp"
-//#include "lib/util.hpp"
#include
@@ -40,7 +38,6 @@ namespace steam {
namespace engine{
namespace test {
-
namespace {
/** uninitialised local storage that can be passed
* as working buffer and accessed as TestFrame */
@@ -66,6 +63,12 @@ namespace test {
/***************************************************************//**
* @test verify support for developing Render Node functionality.
+ * - raw processing functions to generate and manipulate
+ * \ref TestFrame data, including hash chaining.
+ * - a »TestRand-Ontology«, which is a test helper framework,
+ * and mimics a real _Domain Ontology_ (as would be accessible
+ * through the adapter plug-in of a specific media handling library.
+ * - some convenience shortcuts to build test-nodes
*/
class NodeDevel_test : public Test
{
diff --git a/tests/core/steam/engine/node-link-test.cpp b/tests/core/steam/engine/node-link-test.cpp
index 4626c21f9..152bd3ffa 100644
--- a/tests/core/steam/engine/node-link-test.cpp
+++ b/tests/core/steam/engine/node-link-test.cpp
@@ -319,6 +319,73 @@ namespace test {
void
trigger_node_port_invocation()
{
+ auto testGen = testRand().setupGenerator();
+ auto testMan = testRand().setupManipulator();
+ auto testMix = testRand().setupCombinator();
+
+/*
+ // A Node with two (source) ports
+ ProcNode n1s{prepareNode("srcA")
+ .preparePort()
+ .invoke("a(int)", src_op)
+ .setParam(5)
+ .completePort()
+ .preparePort()
+ .invoke("b(int)", src_op)
+ .setParam(23)
+ .completePort()
+ .build()};
+
+ // A node to add some "processing" to each data chain
+ auto add1_op = [](int* src, int* res){ *res = 1 + *src; };
+ ProcNode n1f{prepareNode("filterA")
+ .preparePort()
+ .invoke("a+1(int)(int)", add1_op)
+ .connectLead(n1s)
+ .completePort()
+ .preparePort()
+ .invoke("b+1(int)(int)", add1_op)
+ .connectLead(n1s)
+ .completePort()
+ .build()};
+
+ // Need a secondary source, this time with three ports
+ ProcNode n2s{prepareNode("srcB")
+ .preparePort()
+ .invoke("a(int)", src_op)
+ .setParam(7)
+ .completePort()
+ .preparePort()
+ .invoke("b(int)", src_op)
+ .setParam(13)
+ .completePort()
+ .preparePort()
+ .invoke("c(int)", src_op)
+ .setParam(17)
+ .completePort()
+ .build()};
+
+ // Wiring for the Mix, building up three ports
+ // Since the first source-chain has only two ports,
+ // for the third result port we'll re-use the second source
+ ProcNode mix{prepareNode("mix")
+ .preparePort()
+ .invoke("a-mix(int/2)(int)", mix_op)
+ .connectLead(n1f)
+ .connectLead(n2s)
+ .completePort()
+ .preparePort()
+ .invoke("b-mix(int/2)(int)", mix_op)
+ .connectLead(n1f)
+ .connectLead(n2s)
+ .completePort()
+ .preparePort()
+ .invoke("c-mix(int/2)(int)", mix_op)
+ .connectLeadPort(n1f,1)
+ .connectLead(n2s)
+ .completePort()
+ .build()};
+*/
UNIMPLEMENTED ("operate some render nodes as linked together");
}
};
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 3e5522278..f770a383e 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -93948,7 +93948,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -94446,13 +94446,13 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
-
-
+
+
@@ -94461,19 +94461,26 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
+
+
+
+
-
+
-
+
+
-
+
@@ -94546,7 +94553,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -94562,6 +94569,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
@@ -94577,6 +94585,9 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
+
@@ -97878,7 +97889,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -97916,24 +97927,24 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -97945,10 +97956,10 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
@@ -98016,7 +98027,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -98061,8 +98072,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -98146,8 +98157,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
-
+
+
@@ -98155,6 +98166,10 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
+
+
@@ -99191,8 +99206,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
-
+
+
@@ -99206,7 +99221,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -99382,8 +99397,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
umbenannt in MediaWeavingPattern
-
-
+
@@ -99392,11 +99406,11 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
@@ -99466,7 +99480,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -99504,7 +99518,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -99513,6 +99527,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
@@ -99537,9 +99553,9 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
@@ -99549,7 +99565,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -99590,9 +99606,9 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
@@ -99610,7 +99626,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -100886,7 +100902,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
@@ -102538,7 +102554,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
-
+
@@ -103191,7 +103207,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
-
+
@@ -104452,8 +104468,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
ergibt hier keinen Sinn — berechnet wird eine einfache lineare Interpolation, zwar ohne Beschränkung des Wertebereichs, jedoch sind aus Sicht des Aufrufers nur Werte [0.0 ... 1.0] plausibel
-
-
+
@@ -105406,8 +105421,7 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
...da war doch irgendwas mit der Sequenz-Nr und Channel-Nr, die habe ich entweder mit anderen Aufrufen harmonisiert oder die Anordnung im Cache verändert; wenn ich mich bloß an die Details erinnern könnte
-
-
+