From 488793174fdc8c19ff2b40149294e4486464cf55 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Wed, 18 Dec 2024 22:22:28 +0100 Subject: [PATCH] Invocation: can now accept complex buffer arguments Add a test case with a wild mix of array and tuple. Yay! the new code works right away... --- tests/core/steam/engine/node-base-test.cpp | 105 +++++++++++++++++++-- wiki/thinkPad.ichthyo.mm | 104 +++++++++----------- 2 files changed, 144 insertions(+), 65 deletions(-) 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
    + + +