diff --git a/src/steam/engine/job-ticket.hpp b/src/steam/engine/job-ticket.hpp index 37c5d3b80..c8f532da6 100644 --- a/src/steam/engine/job-ticket.hpp +++ b/src/steam/engine/job-ticket.hpp @@ -100,9 +100,9 @@ using lib::LUID; struct Prerequisite { Prerequisite* next{nullptr}; - JobTicket& descriptor; + JobTicket const& descriptor; - Prerequisite (JobTicket& ticket) + Prerequisite (JobTicket const& ticket) : descriptor{ticket} { } }; @@ -131,6 +131,8 @@ using lib::LUID; template static LinkedElements buildProvisionSpec (IT); + static LinkedElements buildProvisionSpec (ExitNode const&); + private: JobTicket() { } ///< @internal as NIL marker, a JobTicket can be empty @@ -141,13 +143,16 @@ using lib::LUID; { } public: - class ExplorationState; - friend class ExplorationState; + JobTicket (ExitNode const& exitNode) + : provision_{buildProvisionSpec (exitNode)} + { } static const JobTicket NOP; + class ExplorationState; + friend class ExplorationState; ExplorationState startExploration() const; ////////////////////////////TICKET #1276 : likely to become obsolete ExplorationState discoverPrerequisites (uint channelNr =0) const; ////////////////////////////TICKET #1276 : likely to become obsolete @@ -250,7 +255,7 @@ using lib::LUID; } - JobTicket* + JobTicket const * operator->() const { REQUIRE (!empty() && toExplore_.top().isValid()); @@ -331,6 +336,19 @@ using lib::LUID; ENSURE (not isnil (provisionSpec)); return provisionSpec; } + inline LinkedElements + JobTicket::buildProvisionSpec (ExitNode const& exitNode) + { + REQUIRE (not isnil (exitNode)); // has valid functor + LinkedElements provisionSpec; + HashVal invoSeed = exitNode.getPipelineIdentity(); + JobFunctor& func = exitNode.getInvocationFunctor(); + auto& provision = provisionSpec.emplace (func, exitNode, invoSeed); + for (ExitNode const& preNode: exitNode.getPrerequisites()) + provision.requirements.emplace(preNode); /////////////////////////////////////////////TICKET #1292 : need to pass in Allocator as argument + //////////////////////////////////////////////////////////////////////OOO : where to ALLOCATE the prerequisite JobTickets ??!! + return provisionSpec; + } diff --git a/src/steam/fixture/segment.hpp b/src/steam/fixture/segment.hpp index 2c6dc51f2..15a784db2 100644 --- a/src/steam/fixture/segment.hpp +++ b/src/steam/fixture/segment.hpp @@ -68,7 +68,7 @@ namespace fixture { class Segment { using TicketAlloc = std::deque; - using PortTable = std::deque>; + using PortTable = std::deque>; protected: @@ -134,36 +134,6 @@ namespace fixture { private: - /** @internal Generate sequence of prerequisite JobTicket */ - auto - assemblePrerequisites (ExitNode const& exitNode) - { - return lib::transformIterator (exitNode.getPrerequisites() - ,[this](ExitNode const& prereq) -> engine::JobTicket& - { - tickets_.emplace_back( - assembleTicketSpec (prereq)); - return tickets_.back(); - }); - } - - - /** @internal Traverse ExitNode structure and prepare JobTicket */ - auto - assembleTicketSpec (ExitNode const& exitNode) - { - REQUIRE (not isnil (exitNode)); // has valid functor - using vault::engine::JobFunctor; - using Prereqs = decltype(assemblePrerequisites (exitNode)); - using SpecTuple = std::tuple; - return lib::singleValIterator( /////////////////////////////////////////TICKET #1297 : multiplicity per channel will be removed here - SpecTuple(exitNode - ,exitNode.getPipelineIdentity() - ,exitNode.getInvocationFunctor() - ,assemblePrerequisites (exitNode) - )); - } - void generateTickets_onDemand (size_t portNr) { @@ -172,8 +142,8 @@ namespace fixture { portTab_.emplace_back (engine::JobTicket::NOP); // disable this slot else {// Ticket was not generated yet... - tickets_.emplace_back (assembleTicketSpec (exitNode[portNr])); - portTab_.emplace_back (tickets_.back()); // ref to new ticket ‣ slot + tickets_.emplace_back (exitNode[portNr]); + portTab_.emplace_back (tickets_.back()); // ref to new ticket ‣ slot } } }; diff --git a/src/steam/fixture/segmentation.cpp b/src/steam/fixture/segmentation.cpp index 0c54202c0..071e51b3c 100644 --- a/src/steam/fixture/segmentation.cpp +++ b/src/steam/fixture/segmentation.cpp @@ -29,7 +29,6 @@ #include "lib/error.hpp" #include "steam/fixture/segmentation.hpp" -//#include "steam/mobject/builder/fixture-change-detector.hpp" ///////////TODO #include "lib/time/timevalue.hpp" #include "lib/split-splice.hpp" @@ -75,14 +74,14 @@ namespace fixture { * @see SplitSplice_test */ Segment const& - Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket) + Segmentation::splitSplice (OptTime start, OptTime after, engine::ExitNodes&& modelLink) { ASSERT (!start or !after or start != after); using Iter = typename list::iterator; auto getStart = [](Iter elm) -> Time { return elm->start(); }; auto getAfter = [](Iter elm) -> Time { return elm->after(); }; - auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, jobTicket); }; + auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, move(modelLink)); }; 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 { return segments_.emplace (pos, *src, TimeSpan{start, after}); }; auto discard = [&](Iter pos, Iter after) -> Iter { return segments_.erase (pos,after); }; diff --git a/src/steam/fixture/segmentation.hpp b/src/steam/fixture/segmentation.hpp index de71102e5..e09f9406d 100644 --- a/src/steam/fixture/segmentation.hpp +++ b/src/steam/fixture/segmentation.hpp @@ -121,7 +121,7 @@ namespace fixture { /** rework the existing Segmentation to include a new Segment as specified */ Segment const& - splitSplice (OptTime start, OptTime after, const engine::JobTicket* =nullptr); + splitSplice (OptTime start, OptTime after, engine::ExitNodes&& modelLink =ExitNodes{}); }; diff --git a/tests/core/steam/engine/mock-dispatcher.hpp b/tests/core/steam/engine/mock-dispatcher.hpp index 1878ff565..2f5c02f67 100644 --- a/tests/core/steam/engine/mock-dispatcher.hpp +++ b/tests/core/steam/engine/mock-dispatcher.hpp @@ -93,22 +93,12 @@ namespace test { /* ===== specify a mock JobTicket setup for tests ===== */ - template - inline auto - defineSpec (HashVal seed, IT&& prereq) - { - using SpecTuple = std::tuple; - return lib::singleValIterator( /////////////////////////////////////////////TICKET #1297 : multiplicity per channel will be removed here - SpecTuple(ExitNode::NIL - ,DummyJob::getFunctor() - , seed - , std::forward (prereq))); - } - - inline auto + inline ExitNode defineSimpleSpec (HashVal seed =0) { - return defineSpec (seed, lib::nilIterator()); + return ExitNode{seed + ,ExitNodes{} + ,& DummyJob::getFunctor()}; } }//(End)internal test helpers.... @@ -140,10 +130,10 @@ namespace test { : JobTicket{defineSimpleSpec (seed)} { } - template - MockJobTicket (HashVal seed, IT&& prereq) - : JobTicket{defineSpec (seed, std::forward (prereq))} - { } +// template +// MockJobTicket (HashVal seed, IT&& prereq) +// : JobTicket{defineSpec (seed, std::forward (prereq))} +// { } /* ===== Diagnostics ===== */ @@ -191,11 +181,11 @@ namespace test { { for (auto& spec : specs) { - JobTicket& newTicket = buildTicketFromSpec (spec); - auto start = spec.retrieveAttribute