diff --git a/tests/core/steam/engine/node-base-test.cpp b/tests/core/steam/engine/node-base-test.cpp
index b8f8bafde..7e12e6a40 100644
--- a/tests/core/steam/engine/node-base-test.cpp
+++ b/tests/core/steam/engine/node-base-test.cpp
@@ -17,7 +17,7 @@
#include "lib/test/run.hpp"
-//#include "lib/test/test-helper.hpp"
+#include "lib/iter-zip.hpp"
#include "lib/meta/function.hpp"
#include "steam/engine/proc-node.hpp"
#include "steam/engine/turnout.hpp"
@@ -25,15 +25,18 @@
#include "steam/engine/feed-manifold.hpp"
#include "steam/engine/diagnostic-buffer-provider.hpp"
#include "steam/engine/buffhandle-attach.hpp"
+#include "lib/test/test-helper.hpp"
//#include "lib/format-cout.hpp"
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
+#include "lib/format-util.hpp"///////////////////////////////TODO
#include "lib/util.hpp"
//using std::string;
-using std::tuple;/////////////TODO
- using std::array;
+using std::tuple;
+using std::array;
using util::isSameAdr;
+using lib::test::showType;
namespace steam {
@@ -117,6 +120,7 @@ namespace test {
m1.invoke(); // invoke the adapted processing function (fun_singleOut)
CHECK (buff.accessAs() == r1); // result: the random number r1 was written into the buffer.
+
// Example-2: adapt a function to process input -> output buffer
auto fun_singleInOut = [](Buffer* in, Buffer* out) { *out = *in + 1; };
using M2 = FeedManifold;
@@ -135,8 +139,6 @@ namespace test {
// and get a new buffer to capture the output
BuffHandle buffOut = provider.lockBufferFor (-99);
CHECK (buff.accessAs() == r1);
-SHOW_EXPR(buff.accessAs())
-SHOW_EXPR(buffOut.accessAs())
CHECK (buffOut.accessAs() == -55); ///////////////////////////////////////OOO should be -99 --> aliasing of buffer meta records due to bug with hash generation
// configure the Manifold-2 with this input and output buffer
@@ -154,10 +156,97 @@ SHOW_EXPR(buffOut.accessAs())
CHECK (*m2.outArgs == -55); ////////////////////////////////OOO should be -99
m2.invoke();
-SHOW_EXPR(r1)
-SHOW_EXPR(*m1.outArgs)
-SHOW_EXPR(*m2.outArgs)
CHECK (buffOut.accessAs() == r1+1);
+
+
+ // Example-3: accept complex buffer setup
+ using Sequence = array;
+ using Channels = array;
+ using Compound = tuple;
+ auto fun_complexInOut = [](Channels in, Compound out)
+ {
+ auto [seq,extra] = out;
+ for (auto [i,b] : lib::izip(in))
+ {
+ (*seq)[i] = *b + 1;
+ *extra += *b;
+ }
+ };
+ using M3 = FeedManifold;
+ CHECK ( M3::hasInput());
+ CHECK (not M3::hasParam());
+ CHECK (3 == M3::FAN_I);
+ CHECK (2 == M3::FAN_O);
+ CHECK (showType() == "array"_expect);
+ CHECK (showType() == "tuple*, long*>"_expect);
+ // instantiate...
+ M3 m3{fun_complexInOut};
+ CHECK (3 == m3.inBuff.array().size());
+ CHECK (2 == m3.outBuff.array().size());
+
+ // use existing buffers and one additional buffer for input
+ BuffHandle buffI0 = buff;
+ BuffHandle buffI1 = buffOut;
+ BuffHandle buffI2 = provider.lockBufferFor (-22);
+SHOW_EXPR(buffI0.accessAs())
+SHOW_EXPR(buffI1.accessAs())
+SHOW_EXPR(buffI2.accessAs())
+ CHECK (buffI0.accessAs() == r1 ); // (result from Example-1)
+ CHECK (buffI1.accessAs() == r1+1); // (result from Example-2)
+ CHECK (buffI2.accessAs() == -55 ); ///////////////////////////////////////OOO should be -22
+ // prepare a compound buffer and an extra buffer for output...
+ BuffHandle buffO0 = provider.lockBufferFor (Sequence{-111,-222,-333});
+ BuffHandle buffO1 = provider.lockBufferFor (-33);
+SHOW_EXPR(util::join(buffO0.accessAs()))
+SHOW_EXPR(buffO1.accessAs())
+ CHECK ((buffO0.accessAs() == Sequence{-111,-222,-333}));
+ CHECK (buffO1.accessAs() == -55 ); ///////////////////////////////////////OOO should be -33
+
+ // configure the Manifold-3 with these input and output buffers
+ m3.inBuff.createAt (0, buffI0);
+ m3.inBuff.createAt (1, buffI1);
+ m3.inBuff.createAt (2, buffI2);
+ m3.outBuff.createAt(0, buffO0);
+ m3.outBuff.createAt(1, buffO1);
+ m3.connect();
+SHOW_EXPR(m3.inArgs)
+SHOW_EXPR(m3.outArgs)
+ // Verify data exposed prior to invocation....
+ auto& [ia0,ia1,ia2] = m3.inArgs;
+ auto& [oa0,oa1] = m3.outArgs;
+ auto& [o00,o01,o02] = *oa0;
+SHOW_EXPR(ia0)
+SHOW_EXPR(ia1)
+SHOW_EXPR(ia2)
+SHOW_EXPR(oa0)
+SHOW_EXPR(o00)
+SHOW_EXPR(o01)
+SHOW_EXPR(o02)
+SHOW_EXPR(oa1)
+ CHECK (*ia0 == r1 );
+ CHECK (*ia1 == r1+1);
+ CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22
+ CHECK ( o00 == -111);
+ CHECK ( o01 == -222);
+ CHECK ( o02 == -333);
+ CHECK (*oa1 == -55 ); /////////////////////////////////////////////////////OOO should be -33
+
+ m3.invoke();
+SHOW_EXPR(ia0)
+SHOW_EXPR(ia1)
+SHOW_EXPR(ia2)
+SHOW_EXPR(oa0)
+SHOW_EXPR(o00)
+SHOW_EXPR(o01)
+SHOW_EXPR(o02)
+SHOW_EXPR(oa1)
+ CHECK (*ia0 == r1 ); // Input buffers unchanged
+ CHECK (*ia1 == r1+1);
+ CHECK (*ia2 == -55 ); /////////////////////////////////////////////////////OOO should be -22
+ CHECK ( o00 == *ia0+1); // Output buffers as processed by the function
+ CHECK ( o01 == *ia1+1);
+ CHECK ( o02 == *ia2+1);
+ CHECK (*oa1 == -55 + *ia0+*ia1+*ia2); ///////////////////////////////////////////OOO should be -33
}
};
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 260cc0b14..b31a37af1 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -25554,9 +25554,7 @@
-
-
-
+
der ctor des DisplayFrame bekommt einen Funktor oder Lambda,
@@ -26344,9 +26342,7 @@
-
-
-
+
Habe mich hier für eine komplett unterirdische Verbindung entschieden, denn ich möchte keinesfalls den Layout-Manager zu einem sichtbaren Akteur ausbauen — ein »Layout-Manager« wäre eine derart offensichtliche zentrale Autorität, daß der Weg zur „Gott-Klasse“ nicht mehr weit ist
@@ -26932,9 +26928,7 @@
-
-
-
+
"Mathe für 6-13 järige" etc
@@ -27122,9 +27116,7 @@
-
-
-
+
Die Geometrie-Elemente in den Sketch-Objekten sind eine Spezial-Implementierung, und keine »first class citizens«. Es ist nicht klar, wie man sie aus Expressions referenzieren kann (kein sauberes DSL-Design). Das Dependency-Management ist viel zu naiv implementiert, und es wird empfohlen, mit Tricks und Kniffen zu arbeiten.
@@ -27610,9 +27602,7 @@
-
-
-
+
⤷ kommend von DisplayFrame::sync_and_balance (DisplayEvaluation&)
@@ -28712,9 +28702,7 @@
-
-
-
+
...denn es handelt sich hierbei um einen Konstruktionstrick.
@@ -30624,9 +30612,7 @@
-
-
-
+
naheliegend: das BodyCanvasWidget selber
@@ -31353,9 +31339,7 @@
-
-
-
+
widget->get_style_context();
@@ -33547,9 +33531,7 @@
-
-
-
+
die gekoppelten Scrollbars funktionieren dann "von selber"
@@ -34253,9 +34235,7 @@
-
-
-
+
ERR: nexus.hpp:189: worker_3: ~Nexus: Some UI components are still connected to the backbone.
@@ -34902,9 +34882,7 @@
-
-
-
+
was ist das?
@@ -35504,9 +35482,7 @@
-
-
-
+
Docks enthalten Component Views
@@ -36195,9 +36171,7 @@
-
-
-
+
suche (case insensitive) nach application_activate
@@ -36744,9 +36718,7 @@
-
-
-
+
-
@@ -87396,7 +87368,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
+
@@ -88470,15 +88443,18 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
-
+
-
+
+
+
+
@@ -91867,8 +91843,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
Erläuterung: egal wie die interne Logik abläuft, am Ende muß sie für jeden Slot den Typ (kompatibel) ausweisen, der initial für diese Stelle in der Signatur angegeben wurde
-
-
+
@@ -91894,7 +91869,19 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
+
+
+
+
+
+ Die Signatur des Parameter-Funktors folgt eigentlich zwansläufig aus der gegebenen Processing-Function: es muß ein TurnoutSystem& akzeptiert und ein Parameter(Tupel) geliefert werden (by-value). Seiteneffekte im TurnoutSystem sind möglich (aber die Ausnahme)
+
+
+
+
+
+
@@ -92169,7 +92156,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
+
@@ -92184,8 +92172,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
-
+
+
@@ -92358,7 +92346,8 @@ Date: Thu Apr 20 18:53:17 2023 +0200
-
+
+
@@ -92478,8 +92467,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
void dummyOp (NoArg in, SoloArg out)
-
-
+
@@ -92490,8 +92478,7 @@ Date: Thu Apr 20 18:53:17 2023 +0200
rein logisch läßt sich das nicht lösen — die Entscheidung beruht dann auf einer willkürlichen Konvention; im Moment habe ich fesgelegt: »das können keine Buffer sein«
-
-
+
@@ -92513,6 +92500,9 @@ Date: Thu Apr 20 18:53:17 2023 +0200
+
+
+