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:
parent
256045f91d
commit
e5cdb86ac3
6 changed files with 85 additions and 32 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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üfen ob machbar">
|
<node COLOR="#338800" CREATED="1683046728800" ID="ID_1510597200" MODIFIED="1683081137760" STYLE="fork" TEXT="prü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ür einfach das JobTicket per λ-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ü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ß leere Intervalle zusammengeführt werden"/>
|
<node CREATED="1682993108314" ID="ID_317827435" MODIFIED="1682993122827" TEXT="hinzu kommt die Variante, daß leere Intervalle zusammengefü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älle">
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683250859522" TEXT="Segmentation-Standardfä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älle">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1142231389" MODIFIED="1683047144754" TEXT="degenerierte Fälle">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue