2 #include <Scenario/Document/BaseScenario/BaseScenario.hpp>
3 #include <Scenario/Document/Event/EventModel.hpp>
4 #include <Scenario/Document/Interval/IntervalModel.hpp>
5 #include <Scenario/Document/State/ItemModel/MessageItemModel.hpp>
6 #include <Scenario/Document/State/StateModel.hpp>
7 #include <Scenario/Document/TimeSync/TimeSyncModel.hpp>
8 #include <Scenario/Process/Algorithms/Accessors.hpp>
9 #include <Scenario/Process/ScenarioModel.hpp>
11 #include <score/document/DocumentContext.hpp>
12 #include <score/model/Component.hpp>
13 #include <score/model/ComponentSerialization.hpp>
14 #include <score/tools/IdentifierGeneration.hpp>
16 #include <ossia/detail/algorithms.hpp>
21 typename Component_T,
typename Scenario_T,
typename IntervalComponent_T,
22 bool HasOwnership =
true>
25 ,
public Nano::Observer
32 IntervalComponent_T& component;
36 template <
typename... Args>
38 : Component_T{std::forward<Args>(args)...}
45 template <
typename... Args>
47 : Component_T{std::forward<Args>(args)...}
52 void init() { setup<Scenario::IntervalModel>(); }
54 const std::list<IntervalPair>& intervals_pairs()
const {
return m_intervals; }
58 for(
auto element : m_intervals)
66 template <
typename elt_t>
67 void remove(
const elt_t& element)
69 using map_t = MatchingComponent<elt_t, true>;
70 auto& container = this->*map_t::local_container;
72 auto it = ossia::find_if(
73 container, [&](
auto pair) {
return &pair.element == &element; });
75 if(it != container.end())
83 template <
typename T,
bool dummy = true>
84 struct MatchingComponent;
86 template <
typename Pair_T>
87 void do_cleanup(
const Pair_T& pair)
89 if constexpr(HasOwnership)
91 Component_T::removing(pair.element, pair.component);
92 pair.element.components().remove(pair.component);
96 auto t = Component_T::removing(pair.element, pair.component);
97 pair.element.components().erase(pair.component);
98 Component_T::removed(pair.element, pair.component, std::move(t));
102 template <
typename elt_t>
105 using map_t = MatchingComponent<elt_t, true>;
106 auto&& member = map_t::scenario_container(Component_T::process());
108 for(
auto& elt : member)
113 member.mutable_added.template connect<
117 member.removing.template connect<
119 &SimpleHierarchicalScenarioComponent::remove>(
this);
122 #if defined(SCORE_SERIALIZABLE_COMPONENTS)
123 template <
typename elt_t>
124 void add(elt_t& element)
126 add(element,
typename score::is_component_serializable<
127 typename MatchingComponent<elt_t, true>::type>::type{});
130 template <
typename elt_t>
131 void add(elt_t& element, score::serializable_tag)
133 using map_t = MatchingComponent<elt_t, true>;
134 using component_t =
typename map_t::type;
138 auto comp = score::deserialize_component<component_t>(
139 element.components(), [&](
auto&& deserializer) {
140 Component_T::template load<component_t>(deserializer, element);
146 comp = Component_T::template make<component_t>(
147 getStrongId(element.components()), element);
153 element.components().add(comp);
154 (this->*map_t::local_container)
155 .emplace_back(
typename map_t::pair_type{element, *comp});
159 template <
typename elt_t>
160 void add(elt_t& element, score::not_serializable_tag)
162 template <
typename elt_t>
163 void add(elt_t& element)
167 using map_t = MatchingComponent<elt_t, true>;
168 auto comp = Component_T::make(getStrongId(element.components()), element);
171 element.components().add(comp);
172 (this->*map_t::local_container)
173 .emplace_back(
typename map_t::pair_type{element, *comp});
177 std::list<IntervalPair> m_intervals;
179 template <
bool dummy>
180 struct MatchingComponent<
Scenario::IntervalModel, dummy>
182 using type = IntervalComponent_T;
183 using pair_type = IntervalPair;
184 static const constexpr
auto local_container
185 = &SimpleHierarchicalScenarioComponent::m_intervals;
186 static const constexpr
auto scenario_container
192 typename Component_T,
typename Scenario_T,
typename IntervalComponent_T,
193 typename EventComponent_T,
typename TimeSyncComponent_T,
typename StateComponent_T,
194 bool HasOwnership =
true>
197 ,
public Nano::Observer
204 IntervalComponent_T& component;
210 EventComponent_T& component;
216 TimeSyncComponent_T& component;
222 StateComponent_T& component;
226 template <
typename... Args>
228 : Component_T{std::forward<Args>(args)...}
235 template <
typename... Args>
237 : Component_T{std::forward<Args>(args)...}
244 setup<Scenario::TimeSyncModel>();
245 setup<Scenario::EventModel>();
246 setup<Scenario::StateModel>();
247 setup<Scenario::IntervalModel>();
250 const std::list<IntervalPair>& intervals_pairs()
const {
return m_intervals; }
251 const std::list<EventPair>& events_pairs()
const {
return m_events; }
252 const std::list<StatePair>& states_pairs()
const {
return m_states; }
253 const std::list<TimeSyncPair>& timeSyncs_pairs()
const {
return m_timeSyncs; }
257 for(
auto element : m_intervals)
259 for(
auto element : m_states)
261 for(
auto element : m_events)
263 for(
auto element : m_timeSyncs)
274 template <
typename elt_t>
275 void remove(
const elt_t& element)
277 using map_t = MatchingComponent<elt_t, true>;
278 auto& container = this->*map_t::local_container;
280 auto it = ossia::find_if(
281 container, [&](
auto pair) {
return &pair.element == &element; });
283 if(it != container.end())
291 template <
typename T,
bool dummy = true>
292 struct MatchingComponent;
294 template <
typename Pair_T>
295 void do_cleanup(
const Pair_T& pair)
297 if constexpr(HasOwnership)
299 Component_T::removing(pair.element, pair.component);
300 pair.element.components().remove(pair.component);
304 auto t = Component_T::removing(pair.element, pair.component);
305 pair.element.components().erase(pair.component);
306 Component_T::removed(pair.element, pair.component, std::move(t));
310 template <
typename elt_t>
313 using map_t = MatchingComponent<elt_t, true>;
314 auto&& member = map_t::scenario_container(Component_T::process());
316 for(
auto& elt : member)
321 member.mutable_added.template connect<&HierarchicalScenarioComponent::add<elt_t>>(
323 member.removing.template connect<&HierarchicalScenarioComponent::remove<elt_t>>(
327 template <
typename elt_t>
328 void add(elt_t& element)
330 #if defined(SCORE_SERIALIZABLE_COMPONENTS)
331 using component_t =
typename MatchingComponent<elt_t, true>::type;
332 constexpr
bool is_serializable
333 = std::is_base_of<score::SerializableComponent, component_t>::value;
334 if constexpr(is_serializable)
336 using map_t = MatchingComponent<elt_t, true>;
337 using component_t =
typename map_t::type;
341 auto comp = score::deserialize_component<component_t>(
342 element.components(), [&](
auto&& deserializer) {
343 Component_T::template load<component_t>(deserializer, element);
349 comp = Component_T::template make<component_t>(element);
355 element.components().add(comp);
356 (this->*map_t::local_container)
357 .emplace_back(
typename map_t::pair_type{element, *comp});
364 using map_t = MatchingComponent<elt_t, true>;
365 auto comp = Component_T::template make<typename map_t::type>(element);
368 element.components().add(comp);
369 (this->*map_t::local_container)
370 .emplace_back(
typename map_t::pair_type{element, *comp});
375 std::list<TimeSyncPair> m_timeSyncs;
376 std::list<EventPair> m_events;
377 std::list<StatePair> m_states;
378 std::list<IntervalPair> m_intervals;
380 template <
bool dummy>
381 struct MatchingComponent<
Scenario::IntervalModel, dummy>
383 using type = IntervalComponent_T;
384 using pair_type = IntervalPair;
385 static const constexpr
auto local_container
386 = &HierarchicalScenarioComponent::m_intervals;
387 static const constexpr
auto scenario_container
390 template <
bool dummy>
391 struct MatchingComponent<
Scenario::EventModel, dummy>
393 using type = EventComponent_T;
394 using pair_type = EventPair;
395 static const constexpr
auto local_container
396 = &HierarchicalScenarioComponent::m_events;
397 static const constexpr
auto scenario_container
400 template <
bool dummy>
401 struct MatchingComponent<
Scenario::TimeSyncModel, dummy>
403 using type = TimeSyncComponent_T;
404 using pair_type = TimeSyncPair;
405 static const constexpr
auto local_container
406 = &HierarchicalScenarioComponent::m_timeSyncs;
407 static const constexpr
auto scenario_container
410 template <
bool dummy>
411 struct MatchingComponent<
Scenario::StateModel, dummy>
413 using type = StateComponent_T;
414 using pair_type = StatePair;
415 static const constexpr
auto local_container
416 = &HierarchicalScenarioComponent::m_states;
417 static const constexpr
auto scenario_container
423 typename Component_T,
typename BaseScenario_T,
typename IntervalComponent_T,
424 typename EventComponent_T,
typename TimeSyncComponent_T,
typename StateComponent_T>
427 ,
public Nano::Observer
434 IntervalComponent_T& component;
440 EventComponent_T& component;
446 TimeSyncComponent_T& component;
452 StateComponent_T& component;
455 template <
typename... Args>
457 : Component_T{std::forward<Args>(args)...}
458 , m_timeSyncs{setup<
Scenario::TimeSyncModel>(0), setup<
Scenario::TimeSyncModel>(1)}
461 , m_intervals{setup<
Scenario::IntervalModel>(0)}
465 const auto& intervals()
const {
return m_intervals; }
466 const auto& events()
const {
return m_events; }
467 const auto& states()
const {
return m_states; }
468 const auto& timeSyncs()
const {
return m_timeSyncs; }
472 for(
auto element : m_intervals)
474 for(
auto element : m_states)
476 for(
auto element : m_events)
478 for(
auto element : m_timeSyncs)
490 template <
typename T,
bool dummy = true>
491 struct MatchingComponent;
493 template <
typename Pair_T>
494 void cleanup(
const Pair_T& pair)
496 Component_T::removing(pair.element, pair.component);
497 pair.element.components().remove(pair.component);
500 template <
typename elt_t>
503 using map_t = MatchingComponent<elt_t, true>;
504 auto&& member = map_t::scenario_container(this->process());
506 return add(member[pos], pos);
509 template <
typename elt_t>
510 auto add(elt_t& element,
int pos)
512 using map_t = MatchingComponent<elt_t, true>;
513 auto comp = Component_T::template make<typename map_t::type>(
514 getStrongId(element.components()), element);
517 element.components().add(comp);
518 return typename map_t::pair_type{element, *comp};
521 template <
typename elt_t>
522 void remove(
const elt_t& element)
524 using map_t = MatchingComponent<elt_t, true>;
525 auto& container = this->*map_t::local_container;
527 auto it = find_if(container, [&](
auto pair) {
return &pair.element == &element; });
529 if(it != container.end())
536 std::list<TimeSyncPair> m_timeSyncs;
537 std::list<EventPair> m_events;
538 std::list<StatePair> m_states;
539 std::list<IntervalPair> m_intervals;
541 template <
bool dummy>
542 struct MatchingComponent<
Scenario::IntervalModel, dummy>
544 using type = IntervalComponent_T;
545 using pair_type = IntervalPair;
546 static const constexpr
auto local_container = &HierarchicalBaseScenario::m_intervals;
547 static const constexpr
auto scenario_container
550 template <
bool dummy>
551 struct MatchingComponent<
Scenario::EventModel, dummy>
553 using type = EventComponent_T;
554 using pair_type = EventPair;
555 static const constexpr
auto local_container = &HierarchicalBaseScenario::m_events;
556 static const constexpr
auto scenario_container
559 template <
bool dummy>
560 struct MatchingComponent<
Scenario::TimeSyncModel, dummy>
562 using type = TimeSyncComponent_T;
563 using pair_type = TimeSyncPair;
564 static const constexpr
auto local_container = &HierarchicalBaseScenario::m_timeSyncs;
565 static const constexpr
auto scenario_container
568 template <
bool dummy>
569 struct MatchingComponent<
Scenario::StateModel, dummy>
571 using type = StateComponent_T;
572 using pair_type = StatePair;
573 static const constexpr
auto local_container = &HierarchicalBaseScenario::m_states;
574 static const constexpr
auto scenario_container
Definition: Scenario/Document/Components/ScenarioComponent.hpp:428
Definition: Scenario/Document/Components/ScenarioComponent.hpp:198
HierarchicalScenarioComponent(Args &&... args)
The default constructor will also initialize the children.
Definition: Scenario/Document/Components/ScenarioComponent.hpp:227
void init()
Do not forget to call this when using the lazy constructor.
Definition: Scenario/Document/Components/ScenarioComponent.hpp:242
HierarchicalScenarioComponent(score::lazy_init_t, Args &&... args)
Definition: Scenario/Document/Components/ScenarioComponent.hpp:236
Definition: EventModel.hpp:36
Definition: IntervalModel.hpp:50
Definition: StateModel.hpp:63
Definition: TimeSyncModel.hpp:35
Definition: Scenario/Document/Components/ScenarioComponent.hpp:26
SimpleHierarchicalScenarioComponent(Args &&... args)
The default constructor will also initialize the children.
Definition: Scenario/Document/Components/ScenarioComponent.hpp:37
void init()
Do not forget to call this when using the lazy constructor.
Definition: Scenario/Document/Components/ScenarioComponent.hpp:52
SimpleHierarchicalScenarioComponent(score::lazy_init_t, Args &&... args)
Definition: Scenario/Document/Components/ScenarioComponent.hpp:46
Main plug-in of score.
Definition: score-plugin-dataflow/Dataflow/PortItem.hpp:14
Definition: Scenario/Document/Components/ScenarioComponent.hpp:437
Definition: Scenario/Document/Components/ScenarioComponent.hpp:431
Definition: Scenario/Document/Components/ScenarioComponent.hpp:449
Definition: Scenario/Document/Components/ScenarioComponent.hpp:443
Definition: Scenario/Document/Components/ScenarioComponent.hpp:207
Definition: Scenario/Document/Components/ScenarioComponent.hpp:201
Definition: Scenario/Document/Components/ScenarioComponent.hpp:219
Definition: Scenario/Document/Components/ScenarioComponent.hpp:213
Definition: ScenarioInterface.hpp:55
Definition: Scenario/Document/Components/ScenarioComponent.hpp:29
Definition: lib/score/model/Component.hpp:16