Loading...
Searching...
No Matches
Accessors.hpp
1#pragma once
2#include <Scenario/Document/Event/EventModel.hpp>
3#include <Scenario/Document/Interval/IntervalModel.hpp>
4#include <Scenario/Document/State/StateModel.hpp>
5#include <Scenario/Document/TimeSync/TimeSyncModel.hpp>
6#include <Scenario/Process/ScenarioModel.hpp>
7// Intervals
8namespace Scenario
9{
10template <typename Scenario_T>
11StateModel& startState(const IntervalModel& cst, const Scenario_T& scenario)
12{
13 return scenario.state(cst.startState());
14}
15
16template <typename Scenario_T>
17StateModel& endState(const IntervalModel& cst, const Scenario_T& scenario)
18{
19 return scenario.state(cst.endState());
20}
21
22template <typename Scenario_T>
23EventModel& startEvent(const IntervalModel& cst, const Scenario_T& scenario)
24{
25 return scenario.event(startState(cst, scenario).eventId());
26}
27
28template <typename Scenario_T>
29EventModel& endEvent(const IntervalModel& cst, const Scenario_T& scenario)
30{
31 return scenario.event(endState(cst, scenario).eventId());
32}
33
34template <typename Scenario_T>
35TimeSyncModel& startTimeSync(const IntervalModel& cst, const Scenario_T& scenario)
36{
37 return scenario.timeSync(startEvent(cst, scenario).timeSync());
38}
39
40template <typename Scenario_T>
41TimeSyncModel& endTimeSync(const IntervalModel& cst, const Scenario_T& scenario)
42{
43 return scenario.timeSync(endEvent(cst, scenario).timeSync());
44}
45
46// Events
47template <typename Scenario_T>
48const TimeSyncModel& parentTimeSync(const EventModel& ev, const Scenario_T& scenario)
49{
50 return scenario.timeSync(ev.timeSync());
51}
52
53template <typename Scenario_T>
54const TimeSyncModel& parentTimeSync(const Id<EventModel>& ev, const Scenario_T& scenario)
55{
56 return scenario.timeSync(scenario.event(ev).timeSync());
57}
58
59// States
60template <typename Scenario_T>
61const EventModel& parentEvent(const Id<StateModel>& st, const Scenario_T& scenario)
62{
63 return scenario.event(scenario.state(st).eventId());
64}
65
66template <typename Scenario_T>
67const EventModel& parentEvent(const StateModel& st, const Scenario_T& scenario)
68{
69 return scenario.event(st.eventId());
70}
71
72template <typename Scenario_T>
73const TimeSyncModel& parentTimeSync(const StateModel& st, const Scenario_T& scenario)
74{
75 return parentTimeSync(parentEvent(st, scenario), scenario);
76}
77
78template <typename Scenario_T>
79const TimeSyncModel& parentTimeSync(const Id<StateModel>& st, const Scenario_T& scenario)
80{
81 return parentTimeSync(parentEvent(st, scenario), scenario);
82}
83
84// This one is just here to allow generic facilities
85template <typename Scenario_T>
86const TimeSyncModel& parentTimeSync(const TimeSyncModel& st, const Scenario_T&)
87{
88 return st;
89}
90
91template <typename Scenario_T>
92const IntervalModel& previousInterval(const StateModel& st, const Scenario_T& scenario)
93{
94 SCORE_ASSERT(st.previousInterval());
95 return scenario.interval(*st.previousInterval());
96}
97
98template <typename Scenario_T>
99const IntervalModel& nextInterval(const StateModel& st, const Scenario_T& scenario)
100{
101 SCORE_ASSERT(st.nextInterval());
102 return scenario.interval(*st.nextInterval());
103}
104
105template <typename Scenario_T>
106std::list<Id<IntervalModel>>
107nextIntervals(const EventModel& ev, const Scenario_T& scenario)
108{
109 std::list<Id<IntervalModel>> intervals;
110 for(const Id<StateModel>& state : ev.states())
111 {
112 const StateModel& st = scenario.state(state);
113 if(const auto& cst_id = st.nextInterval())
114 intervals.push_back(*cst_id);
115 }
116 return intervals;
117}
118
119template <typename Scenario_T>
120std::list<Id<IntervalModel>>
121nextNonGraphIntervals(const EventModel& ev, const Scenario_T& scenario)
122{
123 std::list<Id<IntervalModel>> intervals;
124 for(const Id<StateModel>& state : ev.states())
125 {
126 const StateModel& st = scenario.state(state);
127 if(const auto& cst_id = st.nextInterval())
128 {
129 if(!scenario.interval(*cst_id).graphal())
130 intervals.push_back(*cst_id);
131 }
132 }
133 return intervals;
134}
135
136template <typename Scenario_T>
137std::list<Id<IntervalModel>>
138previousIntervals(const EventModel& ev, const Scenario_T& scenario)
139{
140 std::list<Id<IntervalModel>> intervals;
141 for(const Id<StateModel>& state : ev.states())
142 {
143 const StateModel& st = scenario.state(state);
144 if(const auto& cst_id = st.previousInterval())
145 intervals.push_back(*cst_id);
146 }
147 return intervals;
148}
149
150template <typename Scenario_T>
151std::list<Id<IntervalModel>>
152previousNonGraphIntervals(const EventModel& ev, const Scenario_T& scenario)
153{
154 std::list<Id<IntervalModel>> intervals;
155 for(const Id<StateModel>& state : ev.states())
156 {
157 const StateModel& st = scenario.state(state);
158 if(const auto& cst_id = st.previousInterval())
159 {
160 if(!scenario.interval(*cst_id).graphal())
161 intervals.push_back(*cst_id);
162 }
163 }
164 return intervals;
165}
166
167template <typename Scenario_T>
168bool hasPreviousIntervals(const EventModel& ev, const Scenario_T& scenario)
169{
170 for(const Id<StateModel>& state : ev.states())
171 {
172 const StateModel& st = scenario.state(state);
173 if(st.previousInterval())
174 return true;
175 }
176 return false;
177}
178
179template <typename Scenario_T>
180bool hasNextIntervals(const EventModel& ev, const Scenario_T& scenario)
181{
182 for(const Id<StateModel>& state : ev.states())
183 {
184 const StateModel& st = scenario.state(state);
185 if(st.nextInterval())
186 return true;
187 }
188 return false;
189}
190
191template <typename Scenario_T>
192bool hasPreviousIntervals(const IntervalModel& tn, const Scenario_T& scenario)
193{
194 const EventModel& event = startEvent(tn, scenario);
195 return hasPreviousIntervals(event, scenario);
196}
197
198template <typename Scenario_T>
199bool hasNextIntervals(const IntervalModel& tn, const Scenario_T& scenario)
200{
201 const EventModel& event = endEvent(tn, scenario);
202 return hasNextIntervals(event, scenario);
203}
204
205template <typename Scenario_T>
206bool isSingular(const IntervalModel& itv, const Scenario_T& scenario)
207{
208 bool singular = itv.processes.empty();
209
210 singular &= !hasNextIntervals(itv, scenario);
211 singular &= !hasPreviousIntervals(itv, scenario);
212
213 auto& start_state = startState(itv, scenario);
214 singular &= start_state.empty();
215
216 auto& end_state = startState(itv, scenario);
217 singular &= end_state.empty();
218
219 return singular;
220}
221// TimeSyncs
222template <typename Scenario_T>
223std::list<Id<IntervalModel>>
224nextIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
225{
226 std::list<Id<IntervalModel>> intervals;
227 for(const Id<EventModel>& event_id : tn.events())
228 {
229 const EventModel& event = scenario.event(event_id);
230 auto next = nextIntervals(event, scenario);
231 intervals.splice(intervals.end(), next);
232 }
233
234 return intervals;
235}
236
237template <typename Scenario_T>
238std::list<Id<IntervalModel>>
239nextNonGraphIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
240{
241 std::list<Id<IntervalModel>> intervals;
242 for(const Id<EventModel>& event_id : tn.events())
243 {
244 const EventModel& event = scenario.event(event_id);
245 auto next = nextNonGraphIntervals(event, scenario);
246 intervals.splice(intervals.end(), next);
247 }
248
249 return intervals;
250}
251
252template <typename Scenario_T>
253std::list<Id<IntervalModel>>
254previousIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
255{
256 std::list<Id<IntervalModel>> intervals;
257 for(const Id<EventModel>& event_id : tn.events())
258 {
259 const EventModel& event = scenario.event(event_id);
260 auto prev = previousIntervals(event, scenario);
261 intervals.splice(intervals.end(), prev);
262 }
263
264 return intervals;
265}
266
267template <typename Scenario_T>
268std::list<Id<IntervalModel>>
269previousNonGraphIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
270{
271 std::list<Id<IntervalModel>> intervals;
272 for(const Id<EventModel>& event_id : tn.events())
273 {
274 const EventModel& event = scenario.event(event_id);
275 auto prev = previousNonGraphIntervals(event, scenario);
276 intervals.splice(intervals.end(), prev);
277 }
278
279 return intervals;
280}
281
282template <typename Scenario_T>
283bool hasPreviousIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
284{
285 for(const Id<EventModel>& event_id : tn.events())
286 {
287 const EventModel& event = scenario.event(event_id);
288 if(hasPreviousIntervals(event, scenario))
289 return true;
290 }
291
292 return false;
293}
294
295template <typename Scenario_T>
296bool hasNextIntervals(const TimeSyncModel& tn, const Scenario_T& scenario)
297{
298 for(const Id<EventModel>& event_id : tn.events())
299 {
300 const EventModel& event = scenario.event(event_id);
301 if(hasNextIntervals(event, scenario))
302 return true;
303 }
304
305 return false;
306}
307
308template <typename Scenario_T>
309std::list<Id<StateModel>> states(const TimeSyncModel& tn, const Scenario_T& scenario)
310{
311 std::list<Id<StateModel>> stateList;
312 for(const Id<EventModel>& event_id : tn.events())
313 {
314 const EventModel& event = scenario.event(event_id);
315 std::list<Id<StateModel>> st{event.states().begin(), event.states().end()};
316
317 stateList.splice(stateList.end(), st);
318 }
319
320 return stateList;
321}
322
323// Dates
324template <typename Element_T, typename Scenario_T>
325const TimeVal& date(const Element_T& e, const Scenario_T& scenario)
326{
327 return parentTimeSync(e, scenario).date();
328}
329template <typename Scenario_T>
330inline const TimeVal& date(const IntervalModel& e, const Scenario_T& scenario)
331{
332 return e.date();
333}
334
335template <typename Element_T>
336Scenario::ScenarioInterface& parentScenario(Element_T&& e)
337{
338 auto p = e.parent();
339 auto s = qobject_cast<Scenario::ProcessModel*>(p);
340 if(s)
341 return *s;
342
343 return *dynamic_cast<Scenario::ScenarioInterface*>(p);
344}
345}
Definition ScenarioInterface.hpp:20
The id_base_t class.
Definition Identifier.hpp:57
Main plug-in of score.
Definition score-plugin-dataflow/Dataflow/PortItem.hpp:13
Definition TimeValue.hpp:21