Segmentation: integrate SplitSplice and build mock-segmentation

...now able to build a mock segmentation which issues dummy jobs,
and is wired such as to verify the right job is invoked for each segment.

And this allows to build and verify the Dispatcher,
without being able to invoke actual render jobs yet.
This commit is contained in:
Fischlurch 2023-05-05 03:46:42 +02:00
parent 256045f91d
commit e5cdb86ac3
6 changed files with 85 additions and 32 deletions

View file

@ -75,9 +75,15 @@ namespace fixture {
// TODO: ownership?? // TODO: ownership??
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #725 : placeholder code ///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #725 : placeholder code
public: public:
Segment (TimeSpan covered =TimeSpan::ALL) Segment (TimeSpan covered =TimeSpan::ALL
,const engine::JobTicket* ticket =nullptr)
: span_{covered} : span_{covered}
, jobTicket_{&engine::JobTicket::NOP} , jobTicket_{ticket? ticket : &engine::JobTicket::NOP}
{ }
Segment (Segment const& original, TimeSpan changed)
: span_{changed}
, jobTicket_{original.jobTicket_}
{ } { }
// default copy acceptable // default copy acceptable

View file

@ -33,6 +33,9 @@
#include "lib/time/timevalue.hpp" #include "lib/time/timevalue.hpp"
#include "lib/split-splice.hpp" #include "lib/split-splice.hpp"
using lib::time::Time;
using lib::time::TimeSpan;
namespace steam { namespace steam {
namespace fixture { namespace fixture {
@ -73,14 +76,15 @@ namespace fixture {
Segment const& Segment const&
Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket) Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket)
{ {
ASSERT (!start or !after or start != after);
using Iter = typename list<Segment>::iterator; using Iter = typename list<Segment>::iterator;
auto getStart = [](Iter elm) -> Time { return elm->start(); }; auto getStart = [](Iter elm) -> Time { return elm->start(); };
auto getAfter = [](Iter elm) -> Time { return elm->after(); }; auto getAfter = [](Iter elm) -> Time { return elm->after(); };
auto createSeg= [](Iter pos, Time start, Time after) -> Iter { UNIMPLEMENTED ("create new Segment"); }; auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, jobTicket); };
auto emptySeg = [](Iter pos, Time start, Time after) -> Iter { UNIMPLEMENTED ("create empty Segment");}; auto emptySeg = [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}); };
auto cloneSeg = [](Iter pos, Time start, Time after, Iter src) -> Iter { UNIMPLEMENTED ("clone Segment and modify time"); }; auto cloneSeg = [&](Iter pos, Time start, Time after, Iter src) -> Iter { return segments_.emplace (pos, *src, TimeSpan{start, after}); };
auto discard = [](Iter pos, Iter after) -> Iter { UNIMPLEMENTED ("discard Segments"); }; auto discard = [&](Iter pos, Iter after) -> Iter { return segments_.erase (pos,after); };
lib::splitsplice::Algo splicer{ getStart lib::splitsplice::Algo splicer{ getStart

View file

@ -208,8 +208,8 @@ namespace test {
for (auto& spec : specs) for (auto& spec : specs)
{ {
JobTicket* newTicket = nullptr; JobTicket* newTicket = nullptr;
auto seed = spec.retrieveAttribute<HashVal> ("mark"); auto seed = spec.retrieveAttribute<int> ("mark");
tickets_.emplace_back (seed? *seed : HashVal(rand() % 1000)); tickets_.emplace_back (seed? HashVal(*seed) : HashVal(rand() % 1000));
newTicket = & tickets_.back(); newTicket = & tickets_.back();
auto start = spec.retrieveAttribute<Time> ("start"); auto start = spec.retrieveAttribute<Time> ("start");

View file

@ -149,9 +149,11 @@ namespace test {
CHECK (util::isSameObject (ticket, JobTicket::NOP)); CHECK (util::isSameObject (ticket, JobTicket::NOP));
} }
{ {
MockSegmentation mockSeg{MakeRec().genNode()}; MockSegmentation mockSegs{MakeRec().genNode()};
CHECK (1 == mockSeg.size()); CHECK (1 == mockSegs.size());
JobTicket const& ticket = mockSeg[someTime].jobTicket(); CHECK (Time::MIN == mockSegs[someTime].start());
CHECK (Time::MAX == mockSegs[someTime].after());
JobTicket const& ticket = mockSegs[someTime].jobTicket();
CHECK (not util::isSameObject (ticket, JobTicket::NOP)); CHECK (not util::isSameObject (ticket, JobTicket::NOP));
Job someJob = ticket.createJobFor(coord); Job someJob = ticket.createJobFor(coord);
@ -163,9 +165,41 @@ namespace test {
CHECK (RealClock::wasRecently (DummyJob::invocationTime (someJob))); CHECK (RealClock::wasRecently (DummyJob::invocationTime (someJob)));
CHECK (someTime == DummyJob::invocationNominalTime (someJob)); CHECK (someTime == DummyJob::invocationNominalTime (someJob));
} }
{
// Marker to verify the job calls back into the right segment
int marker = rand() % 1000;
// Build a Segmentation partitioned at 10s
MockSegmentation mockSegs{MakeRec()
.attrib ("start", Time{0,10}
,"mark", marker)
.genNode()};
CHECK (2 == mockSegs.size());
// since only start-time was given, the SplitSplice-Algo will attach
// the new Segment starting at 10s and expand towards +∞,
// while the left part of the axis is marked as NOP / empty
fixture::Segment const& seg1 = mockSegs[Time::ZERO]; // access anywhere < 10s
fixture::Segment const& seg2 = mockSegs[Time{0,20}]; // access anywhere >= 10s
CHECK ( util::isSameObject (seg1.jobTicket(), JobTicket::NOP));
CHECK (not util::isSameObject (seg2.jobTicket(), JobTicket::NOP));// this one is the active segment
Job job = seg2.jobTicket().createJobFor(coord);
CHECK (not MockJobTicket::isAssociated (job, seg1.jobTicket()));
CHECK ( MockJobTicket::isAssociated (job, seg2.jobTicket()));
CHECK (marker == job.parameter.invoKey.part.a);
job.triggerJob();
CHECK (DummyJob::was_invoked (job));
CHECK (RealClock::wasRecently (DummyJob::invocationTime (job)));
CHECK (marker == DummyJob::invocationAdditionalKey (job)); // DummyClosure is rigged such as to feed back the seed in `part.a`
// and thus we can prove this job really belongs to the marked segment
// create another job from the (empty) seg1
job = seg1.jobTicket().createJobFor (coord);
InvocationInstanceID empty; /////////////////////////////////////////////////////////////////////TICKET #1287 : temporary workaround until we get rid of the C base structs
CHECK (lumiera_invokey_eq (&job.parameter.invoKey, &empty)); // indiate that it's just a placeholder to mark a "NOP"-Job
}
TODO ("cover details of MockSegmentation"); TODO ("cover more details of MockSegmentation");
} }
}; };

View file

@ -106,9 +106,9 @@ namespace engine {
InvocationInstanceID InvocationInstanceID
buildInstanceID (HashVal seed) const override buildInstanceID (HashVal seed) const override
{ {
InvocationInstanceID res; InvocationInstanceID instance;
res.part.a = seed; instance.part.a = seed;
return res; return instance;
} }
size_t size_t

View file

@ -70145,8 +70145,8 @@
</node> </node>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1682993086565" ID="ID_469257294" MODIFIED="1683076810216" TEXT="Implementierung"> <node COLOR="#338800" CREATED="1682993086565" FOLDED="true" ID="ID_469257294" MODIFIED="1683250875747" TEXT="Implementierung">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683042576253" ID="ID_1878728765" MODIFIED="1683076796339" TEXT="Konzept"> <node COLOR="#435e98" CREATED="1683042576253" ID="ID_1878728765" MODIFIED="1683076796339" TEXT="Konzept">
<icon BUILTIN="yes"/> <icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1683042638127" ID="ID_1570983964" MODIFIED="1683076788355" TEXT="Deskriptor SpliceAct"> <node COLOR="#435e98" CREATED="1683042638127" ID="ID_1570983964" MODIFIED="1683076788355" TEXT="Deskriptor SpliceAct">
@ -70236,8 +70236,8 @@
<icon BUILTIN="idea"/> <icon BUILTIN="idea"/>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683046722945" ID="ID_113209914" MODIFIED="1683081268947" TEXT="Generalisierung"> <node COLOR="#338800" CREATED="1683046722945" ID="ID_113209914" MODIFIED="1683245591577" TEXT="Generalisierung">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683046728800" ID="ID_1510597200" MODIFIED="1683081137760" STYLE="fork" TEXT="pr&#xfc;fen ob machbar"> <node COLOR="#338800" CREATED="1683046728800" ID="ID_1510597200" MODIFIED="1683081137760" STYLE="fork" TEXT="pr&#xfc;fen ob machbar">
<icon BUILTIN="help"/> <icon BUILTIN="help"/>
</node> </node>
@ -70249,17 +70249,23 @@
<node COLOR="#338800" CREATED="1683046786608" ID="ID_106487591" MODIFIED="1683081327011" TEXT="getEnd(elm)"> <node COLOR="#338800" CREATED="1683046786608" ID="ID_106487591" MODIFIED="1683081327011" TEXT="getEnd(elm)">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081197660" ID="ID_357336924" MODIFIED="1683081311584" TEXT="createSeg(pos, start,after)"> <node COLOR="#338800" CREATED="1683081197660" ID="ID_357336924" MODIFIED="1683245525718" TEXT="createSeg(pos, start,after)">
<icon BUILTIN="bell"/> <icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683245530718" HGAP="29" ID="ID_1771563243" MODIFIED="1683245560983" TEXT="hierf&#xfc;r einfach das JobTicket per &#x3bb;-closure durchbeben" VSHIFT="3">
<font NAME="SansSerif" SIZE="11"/>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081213154" ID="ID_180921781" MODIFIED="1683081311584" TEXT="emptySeg(pos, start,after)">
<icon BUILTIN="bell"/>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081224201" ID="ID_886281397" MODIFIED="1683081311584" TEXT="cloneSeg(pos, start,after, src)"> <node COLOR="#338800" CREATED="1683081213154" ID="ID_180921781" MODIFIED="1683245525719" TEXT="emptySeg(pos, start,after)">
<icon BUILTIN="bell"/> <icon BUILTIN="button_ok"/>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081234023" ID="ID_263936802" MODIFIED="1683081311584" TEXT="discard(start,after)"> <node COLOR="#338800" CREATED="1683081224201" ID="ID_886281397" MODIFIED="1683245525718" TEXT="cloneSeg(pos, start,after, src)">
<icon BUILTIN="bell"/> <icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683245530718" HGAP="29" ID="ID_883714171" MODIFIED="1683245584960" TEXT="hierf&#xfc;r neue Segment-ctor Variante" VSHIFT="3">
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
<node COLOR="#338800" CREATED="1683081234023" ID="ID_263936802" MODIFIED="1683245525718" TEXT="discard(start,after)">
<icon BUILTIN="button_ok"/>
</node> </node>
</node> </node>
<node COLOR="#338800" CREATED="1683046873340" ID="ID_347563039" MODIFIED="1683081262904" TEXT="Template Parameter deduction einrichten"> <node COLOR="#338800" CREATED="1683046873340" ID="ID_347563039" MODIFIED="1683081262904" TEXT="Template Parameter deduction einrichten">
@ -70315,7 +70321,7 @@
<icon BUILTIN="info"/> <icon BUILTIN="info"/>
</node> </node>
<node CREATED="1682993108314" ID="ID_317827435" MODIFIED="1682993122827" TEXT="hinzu kommt die Variante, da&#xdf; leere Intervalle zusammengef&#xfc;hrt werden"/> <node CREATED="1682993108314" ID="ID_317827435" MODIFIED="1682993122827" TEXT="hinzu kommt die Variante, da&#xdf; leere Intervalle zusammengef&#xfc;hrt werden"/>
<node COLOR="#338800" CREATED="1683046966788" ID="ID_1714211009" MODIFIED="1683208598606" TEXT="splitSplice-Algo isoliert testen"> <node COLOR="#338800" CREATED="1683046966788" FOLDED="true" ID="ID_1714211009" MODIFIED="1683208598606" TEXT="splitSplice-Algo isoliert testen">
<linktarget COLOR="#2ec3d8" DESTINATION="ID_1714211009" ENDARROW="Default" ENDINCLINATION="-141;9;" ID="Arrow_ID_816334190" SOURCE="ID_226373762" STARTARROW="None" STARTINCLINATION="-192;20;"/> <linktarget COLOR="#2ec3d8" DESTINATION="ID_1714211009" ENDARROW="Default" ENDINCLINATION="-141;9;" ID="Arrow_ID_816334190" SOURCE="ID_226373762" STARTARROW="None" STARTINCLINATION="-192;20;"/>
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683120139366" ID="ID_255513798" MODIFIED="1683120148509" TEXT="Test-Setup mit einfachen int-Intevallen"> <node COLOR="#338800" CREATED="1683120139366" ID="ID_255513798" MODIFIED="1683120148509" TEXT="Test-Setup mit einfachen int-Intevallen">
@ -70508,8 +70514,11 @@
</node> </node>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683120244568" TEXT="Segmentation-Standardf&#xe4;lle"> <node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683250859522" TEXT="Segmentation-Standardf&#xe4;lle">
<icon BUILTIN="flag-yellow"/> <icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1683250843877" ID="ID_608613083" MODIFIED="1683250856171" TEXT="einfache Segmentation mit einem Segment ab 10s">
<icon BUILTIN="button_ok"/>
</node>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1142231389" MODIFIED="1683047144754" TEXT="degenerierte F&#xe4;lle"> <node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1142231389" MODIFIED="1683047144754" TEXT="degenerierte F&#xe4;lle">
<icon BUILTIN="flag-yellow"/> <icon BUILTIN="flag-yellow"/>