Invocation: groundwork for a Parameter-Build-Spec
...which in turn would then allow * to refer to extended parameters within scope * to build a Param(Agent)Node, which builds a parameter tuple by invoking the given parameter-functors Can now demonstrate in the test * define several »slots«, each with either value or functor * apply these functors to a `TurnoutSystem`
This commit is contained in:
parent
3406b6abf5
commit
f990f97c41
6 changed files with 153 additions and 14 deletions
|
|
@ -47,6 +47,7 @@ namespace error = lumiera::error;
|
|||
|
||||
#include "lib/time/timequant.hpp"
|
||||
#include "lib/time/quantiser.hpp"
|
||||
#include "lib/time/timecode.hpp"
|
||||
#include "lib/time/mutation.hpp"
|
||||
#include "common/advice.hpp"
|
||||
|
||||
|
|
@ -98,6 +99,20 @@ namespace time {
|
|||
return retrieveQuantiser (gridID);
|
||||
}
|
||||
|
||||
/**
|
||||
* @remark Handles the common case to determine the frame number relative to some time grid.
|
||||
* The regular path for this conversion would be to have a quantiser for this grid,
|
||||
* to construct a QuTime and then a FrameNr instance based on this QuTime. Assuming
|
||||
* that the grid is actually well-known and was registered via Advice-System with
|
||||
* a symbolic ID, the quantiser can directly be retrieved and applied to convert.
|
||||
*/
|
||||
FrameCnt
|
||||
FrameNr::quant (Time const& time, Symbol gridID)
|
||||
{
|
||||
return Quantiser::retrieve(gridID)->gridPoint (time);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** build a time mutation to \em nudge the target time value in steps based on a pre-defined grid.
|
||||
* @param adjustment number of grid steps to apply as offset
|
||||
|
|
|
|||
|
|
@ -107,6 +107,9 @@ namespace time {
|
|||
|
||||
FrameNr (QuTime const& quantisedTime);
|
||||
|
||||
/** convenience shortcut: time grid to frame number */
|
||||
static FrameCnt quant (Time const&, Symbol gridID);// defined in common-services.cpp
|
||||
|
||||
using TCode::operator string;
|
||||
// CountVal implicitly convertible to long ///////////TICKET #882 : outch! should be a 64bit type!
|
||||
};
|
||||
|
|
|
|||
|
|
@ -43,6 +43,9 @@
|
|||
#include "steam/engine/turnout.hpp"
|
||||
#include "steam/engine/turnout-system.hpp"
|
||||
#include "steam/engine/feed-manifold.hpp" ////////////TODO wegdamit
|
||||
#include "lib/meta/function.hpp"
|
||||
#include "lib/meta/variadic-helper.hpp"
|
||||
#include "lib/meta/tuple-helper.hpp"
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation
|
||||
//#include "vault/gear/job.h"
|
||||
//#include "steam/engine/exit-node.hpp"
|
||||
|
|
@ -64,6 +67,8 @@ namespace steam {
|
|||
namespace engine {
|
||||
|
||||
using std::move;
|
||||
using std::forward;
|
||||
using std::make_tuple;
|
||||
using std::tuple;
|
||||
using lib::Several;////TODO RLY?
|
||||
|
||||
|
|
@ -73,11 +78,53 @@ namespace engine {
|
|||
{
|
||||
using Functors = tuple<FUNZ...>;
|
||||
|
||||
using ResTypes = typename lib::meta::ElmTypes<Functors>::template Apply<lib::meta::_FunRet>;
|
||||
using ParamTup = lib::meta::Tuple<ResTypes>;
|
||||
|
||||
Functors functors_;
|
||||
|
||||
ParamBuildSpec (Functors&& funz)
|
||||
: functors_{move (funz)}
|
||||
{ }
|
||||
|
||||
template<typename FUN>
|
||||
auto
|
||||
addSlot (FUN&& paramFun)
|
||||
{
|
||||
return ParamBuildSpec<ANK,FUNZ...,FUN>{std::tuple_cat (move(functors_)
|
||||
,make_tuple (forward<FUN>(paramFun)))};
|
||||
}
|
||||
|
||||
template<typename PAR>
|
||||
auto
|
||||
addValSlot (PAR paramVal)
|
||||
{
|
||||
return addSlot ([paramVal](TurnoutSystem&){ return paramVal; });
|
||||
}
|
||||
|
||||
template<size_t slot>
|
||||
class Slot
|
||||
: util::MoveOnly
|
||||
{
|
||||
ParamBuildSpec& spec_;
|
||||
|
||||
Slot (ParamBuildSpec& spec)
|
||||
: spec_{spec}
|
||||
{ }
|
||||
friend class ParamBuildSpec;
|
||||
|
||||
public:
|
||||
auto
|
||||
invokeParamFun (TurnoutSystem& turnoutSys)
|
||||
{
|
||||
return std::get<slot> (spec_.functors_) (turnoutSys);
|
||||
}
|
||||
};
|
||||
|
||||
template<size_t idx>
|
||||
Slot<idx>
|
||||
slot()
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
auto
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@ namespace engine {
|
|||
{
|
||||
public:
|
||||
using FrontBlock = lib::HeteroData<Time,ProcessKey>;
|
||||
enum {SLOT_TIME = 0
|
||||
,SLOT_KEY = 1
|
||||
};
|
||||
|
||||
private:
|
||||
FrontBlock invoParam_;
|
||||
|
|
@ -70,6 +73,12 @@ namespace engine {
|
|||
TurnoutSystem (Time absoluteNominalTime, ProcessKey procKey =0)
|
||||
: invoParam_{FrontBlock::build (absoluteNominalTime,procKey)}
|
||||
{ }
|
||||
|
||||
Time
|
||||
getNomTime()
|
||||
{
|
||||
return invoParam_.get<SLOT_TIME>();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,9 @@
|
|||
#include "steam/engine/turnout-system.hpp"
|
||||
#include "steam/engine/turnout.hpp"
|
||||
#include "steam/engine/diagnostic-buffer-provider.hpp"
|
||||
#include "steam/asset/meta/time-grid.hpp"
|
||||
#include "lib/several-builder.hpp"
|
||||
#include "lib/time/timecode.hpp"
|
||||
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
|
||||
//#include "lib/util.hpp"
|
||||
|
||||
|
|
@ -32,6 +34,8 @@
|
|||
//using std::string;
|
||||
using lib::Several;
|
||||
using lib::makeSeveral;
|
||||
using lib::time::Time;
|
||||
using lib::time::FSecs;
|
||||
|
||||
|
||||
namespace steam {
|
||||
|
|
@ -105,8 +109,26 @@ namespace test {
|
|||
void
|
||||
feedParamNode()
|
||||
{
|
||||
auto spec = buildParamSpec();
|
||||
SHOW_TYPE(decltype(spec))
|
||||
steam::asset::meta::TimeGrid::build("grid_sec", 1);
|
||||
|
||||
auto fun1 = [](TurnoutSystem& turSys)
|
||||
{
|
||||
return lib::time::FrameNr::quant (turSys.getNomTime(), "grid_sec");
|
||||
};
|
||||
|
||||
auto spec = buildParamSpec()
|
||||
.addValSlot (LIFE_AND_UNIVERSE_4EVER)
|
||||
.addSlot (move (fun1))
|
||||
;
|
||||
using Spec = decltype(spec);
|
||||
SHOW_TYPE(Spec)
|
||||
SHOW_TYPE(Spec::ParamTup)
|
||||
|
||||
TurnoutSystem turnoutSys{Time{FSecs(5,2)}};
|
||||
auto v0 = spec.slot<0>().invokeParamFun (turnoutSys);
|
||||
auto v1 = spec.slot<1>().invokeParamFun (turnoutSys);
|
||||
SHOW_EXPR(v0)
|
||||
SHOW_EXPR(v1)
|
||||
TODO ("implement a simple Builder for ParamAgent-Node");
|
||||
TODO ("then use both together to demonstrate a param data feed here");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86884,7 +86884,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Das muß so sein aus Gründen der logischen Konsistenz: Der Invocation-Mechanismus der Render-Engine ist generisch, und das bedeutet, er kann nichts implizit über das zu rendernde Modell wissen; zwar wird für den Build-Vorgang in <i>absolute Placements</i>  reduziert, aber diese beziehen sich immer noch auf eine bestimmte Timeline — ebenso wie der Render-Vorgang, der <i>auf einer Timeline</i>  abläuft. Das bedeutet, <i>für den Rendervorgang</i> ist das Koordinatensystem <i>implizit</i>, und er gibt nur eine <b>absolute nominal Time</b> relativ dazu an; jedoch wird dieser implizite Kontext in der Job-Planung übersetzt in den Zugriff auf eine bestimmte <i>konkrete Exit-Node.</i> Insofern kann dann ein Job komplett generisch auf der Render-Engine laufen, denn er tarnsportiert sowohl die <i>absolute nominal Time,</i> alsauch die <i>konkrete ExitNode</i>. Das Turnout-System selber ist ebenfalls generisch, und das heißt, es wird nur sinnvoll in Verbindung mit einer ExitNode zur Aufführung gebracht
|
||||
Das muß so sein aus Gründen der logischen Konsistenz: Der Invocation-Mechanismus der Render-Engine ist generisch, und das bedeutet, er kann nichts implizit über das zu rendernde Modell wissen; zwar wird für den Build-Vorgang in <i>absolute Placements </i>reduziert, aber diese beziehen sich immer noch auf eine bestimmte Timeline — ebenso wie der Render-Vorgang, der <i>auf einer Timeline </i>abläuft. Das bedeutet, <i>für den Rendervorgang </i>ist das Koordinatensystem <i>implizit</i>, und er gibt nur eine <b>absolute nominal Time</b> relativ dazu an; jedoch wird dieser implizite Kontext in der Job-Planung übersetzt in den Zugriff auf eine bestimmte <i>konkrete Exit-Node.</i> Insofern kann dann ein Job komplett generisch auf der Render-Engine laufen, denn er tarnsportiert sowohl die <i>absolute nominal Time, </i>alsauch die <i>konkrete ExitNode</i>. Das Turnout-System selber ist ebenfalls generisch, und das heißt, es wird nur sinnvoll in Verbindung mit einer ExitNode zur Aufführung gebracht
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
|
|
@ -88249,6 +88249,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1735434392994" ID="ID_276802280" MODIFIED="1735434450300" TEXT="getNomTime()"/>
|
||||
<node CREATED="1735434466608" ID="ID_1767556385" MODIFIED="1735434474355" TEXT="getProcKey()"/>
|
||||
</node>
|
||||
<node CREATED="1735319814705" ID="ID_1191574208" MODIFIED="1735321333153" TEXT="Zugang zu Chain-Datablock Typ-Konstruktor aus dem NodeBuilder">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -88473,6 +88475,21 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node COLOR="#6e4398" CREATED="1735433957835" HGAP="34" ID="ID_1295659864" MODIFIED="1735434125854" TEXT="naja... etwas Mitleid darf man schon haben" VSHIFT="3">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...hab jetzt die Abkürzung eingebaut FrameNr::quant (time, "Grid")
|
||||
</p>
|
||||
<p>
|
||||
.... somit spart man sich das Konstruiren der QuTime, und einer FrameNr instanz, bloß um dann letztlich in einen int64_t umzuwandeln. Ich halte das für vertretbar, da dennoch das Grid explizit genannt sein muß...
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<font NAME="SansSerif" SIZE="11"/>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1733585833256" ID="ID_423093899" MODIFIED="1733585852018" TEXT="der Test erzeugt eine zufällige nominal Time"/>
|
||||
<node CREATED="1733585871755" ID="ID_1296941844" MODIFIED="1733586199513" TEXT="der Quantiser muß aber in den Render-Nodes liegen">
|
||||
|
|
@ -94165,7 +94182,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1735416170297" ID="ID_736958022" MODIFIED="1735416236279" TEXT="brauche ParamBuildSpec">
|
||||
<linktarget COLOR="#bb1f2e" DESTINATION="ID_736958022" ENDARROW="Default" ENDINCLINATION="-25;-162;" ID="Arrow_ID_44922252" SOURCE="ID_1577179744" STARTARROW="None" STARTINCLINATION="32;153;"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735422554816" ID="ID_197118422" MODIFIED="1735422583207" TEXT="Aufgabe: schrittweise aufbauenbar">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735422554816" ID="ID_197118422" MODIFIED="1735438575232" TEXT="Aufgabe: schrittweise aufbaubar">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1735422591091" ID="ID_1649575055" MODIFIED="1735422735480" TEXT="Diskrepanz zu den HeteroData Chain-Blocks">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -94175,8 +94192,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
Zur Erinnerung: HeteroData ist ein low-level Daten-Layout, das ich speziell für den Anwendungsfall im Turnout mir ausgedacht habe; es beruht auf einer single-linked-List von Datenblöcken, in denen jeweils ein Datentupel sitzt. Und hier liegt das Problem: diese Chain-Blöcke sollen nun schrittweise über eine Builder-Notation aufgebaut werden — aber die Konstruktor-Funktion in HeteroData erwartet die Angabe des <i>ganzen Tupel-Typs auf einmal.</i>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1735428828881" ID="ID_144632434" MODIFIED="1735428918508" TEXT="soll aber aus konkreten Funktoren schrittweise erstellt werden">
|
||||
|
|
@ -94205,8 +94221,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<arrowlink COLOR="#637488" DESTINATION="ID_870944737" ENDARROW="Default" ENDINCLINATION="310;0;" ID="Arrow_ID_1871378220" STARTARROW="None" STARTINCLINATION="145;9;"/>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735430768108" ID="ID_1744058203" MODIFIED="1735430784322" TEXT="cross-builder-Funktionen in ParamBuildSpec selber">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1735430768108" ID="ID_1744058203" MODIFIED="1735438563756" TEXT="cross-builder-Funktionen in ParamBuildSpec selber">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -94227,8 +94243,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
also ein Instanz-Typ allein legt alles fest; keine Indirektion oder Virtualisierung
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1735427390364" ID="ID_986815728" MODIFIED="1735427699072" TEXT="die Funktor-Typen müssen wir speichern">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -94248,8 +94263,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
...weil wir allein mit einer solchen ParamBuildSpec auf ein TurnoutSystem losgehen wollen; eine Hetero-Data prefix-Chain ist damit notwendig, als Anker-Punkt um einen konkreten Konstruktor für einen Chain-Block zu generieren, den wir in den aktuellen StackFrame legen wollen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1735427835239" ID="ID_162062555" MODIFIED="1735427854369" TEXT="alle anderen Infos lassen sich ableiten">
|
||||
<icon BUILTIN="idea"/>
|
||||
|
|
@ -94277,11 +94291,36 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
⟹ Ankerpunkt muß ein nested type <font color="#320bca" face="Monospaced">TurnoutSystem::FrontBlock </font>sein
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#637488" DESTINATION="ID_870944737" ENDARROW="Default" ENDINCLINATION="310;0;" ID="Arrow_ID_1871378220" SOURCE="ID_1331974543" STARTARROW="None" STARTINCLINATION="145;9;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735438595508" ID="ID_696254160" MODIFIED="1735438784764" TEXT="Implementierung">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1735438607044" ID="ID_1948837984" MODIFIED="1735438628651" TEXT="Builder-Anker: buildParamSpec()">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1735438630343" ID="ID_1798062923" MODIFIED="1735438645863" TEXT="cross-builder-Funktionen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1735438647474" ID="ID_1189899375" MODIFIED="1735438665977" TEXT="Typ-Ableitung für Parameter-Werte">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1735438678865" ID="ID_548533062" MODIFIED="1735438686677" TEXT="ähnlich wie für die FeedManifold"/>
|
||||
<node CREATED="1735438687997" ID="ID_283878162" MODIFIED="1735438699784" TEXT="verwendet lib::meta::ElmTypes :: Apply"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735438707680" ID="ID_1085577180" MODIFIED="1735438715228" TEXT="Zugriffs-Slot">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1735438717070" ID="ID_1429780349" MODIFIED="1735438724209" TEXT="jeweiligen Funktor aufrufen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735438726120" ID="ID_1670785950" MODIFIED="1735438739642" TEXT="Daten-Accessor konstruieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735438743590" ID="ID_973914193" MODIFIED="1735438756220" TEXT="Storage-Tupel erzeugen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1735416468553" ID="ID_1257939291" MODIFIED="1735416600613" TEXT="dient als Basis für einen ParamNode-Builder">
|
||||
<arrowlink COLOR="#5747d2" DESTINATION="ID_329885446" ENDARROW="Default" ENDINCLINATION="-844;-25;" ID="Arrow_ID_1824926310" STARTARROW="None" STARTINCLINATION="-633;42;"/>
|
||||
|
|
@ -97712,6 +97751,10 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735417346027" ID="ID_1555206108" MODIFIED="1735417364905" TEXT="zunächst eine ParamBuildSpec anlegen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node CREATED="1735434511762" ID="ID_303778551" MODIFIED="1735434520154" TEXT="einfache Automations-Funktion">
|
||||
<node CREATED="1735434522544" ID="ID_686486120" LINK="#ID_1295659864" MODIFIED="1735434554616" TEXT="brauche Zeit-Quantisierung"/>
|
||||
<node CREATED="1735434579728" ID="ID_1335340741" LINK="#ID_276802280" MODIFIED="1735434603176" TEXT="brauche Accessor in TurnoutSystem"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue