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
8 namespace Scenario
9 {
10 template <typename Scenario_T>
11 StateModel& startState(const IntervalModel& cst, const Scenario_T& scenario)
12 {
13  return scenario.state(cst.startState());
14 }
15 
16 template <typename Scenario_T>
17 StateModel& endState(const IntervalModel& cst, const Scenario_T& scenario)
18 {
19  return scenario.state(cst.endState());
20 }
21 
22 template <typename Scenario_T>
23 EventModel& startEvent(const IntervalModel& cst, const Scenario_T& scenario)
24 {
25  return scenario.event(startState(cst, scenario).eventId());
26 }
27 
28 template <typename Scenario_T>
29 EventModel& endEvent(const IntervalModel& cst, const Scenario_T& scenario)
30 {
31  return scenario.event(endState(cst, scenario).eventId());
32 }
33 
34 template <typename Scenario_T>
35 TimeSyncModel& startTimeSync(const IntervalModel& cst, const Scenario_T& scenario)
36 {
37  return scenario.timeSync(startEvent(cst, scenario).timeSync());
38 }
39 
40 template <typename Scenario_T>
41 TimeSyncModel& endTimeSync(const IntervalModel& cst, const Scenario_T& scenario)
42 {
43  return scenario.timeSync(endEvent(cst, scenario).timeSync());
44 }
45 
46 // Events
47 template <typename Scenario_T>
48 const TimeSyncModel& parentTimeSync(const EventModel& ev, const Scenario_T& scenario)
49 {
50  return scenario.timeSync(ev.timeSync());
51 }
52 
53 template <typename Scenario_T>
54 const TimeSyncModel& parentTimeSync(const Id<EventModel>& ev, const Scenario_T& scenario)
55 {
56  return scenario.timeSync(scenario.event(ev).timeSync());
57 }
58 
59 // States
60 template <typename Scenario_T>
61 const EventModel& parentEvent(const Id<StateModel>& st, const Scenario_T& scenario)
62 {
63  return scenario.event(scenario.state(st).eventId());
64 }
65 
66 template <typename Scenario_T>
67 const EventModel& parentEvent(const StateModel& st, const Scenario_T& scenario)
68 {
69  return scenario.event(st.eventId());
70 }
71 
72 template <typename Scenario_T>
73 const TimeSyncModel& parentTimeSync(const StateModel& st, const Scenario_T& scenario)
74 {
75  return parentTimeSync(parentEvent(st, scenario), scenario);
76 }
77 
78 template <typename Scenario_T>
79 const 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
85 template <typename Scenario_T>
86 const TimeSyncModel& parentTimeSync(const TimeSyncModel& st, const Scenario_T&)
87 {
88  return st;
89 }
90 
91 template <typename Scenario_T>
92 const IntervalModel& previousInterval(const StateModel& st, const Scenario_T& scenario)
93 {
94  SCORE_ASSERT(st.previousInterval());
95  return scenario.interval(*st.previousInterval());
96 }
97 
98 template <typename Scenario_T>
99 const IntervalModel& nextInterval(const StateModel& st, const Scenario_T& scenario)
100 {
101  SCORE_ASSERT(st.nextInterval());
102  return scenario.interval(*st.nextInterval());
103 }
104 
105 template <typename Scenario_T>
106 std::list<Id<IntervalModel>>
107 nextIntervals(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 
119 template <typename Scenario_T>
120 std::list<Id<IntervalModel>>
121 nextNonGraphIntervals(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 
136 template <typename Scenario_T>
137 std::list<Id<IntervalModel>>
138 previousIntervals(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 
150 template <typename Scenario_T>
151 std::list<Id<IntervalModel>>
152 previousNonGraphIntervals(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 
167 template <typename Scenario_T>
168 bool 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 
179 template <typename Scenario_T>
180 bool 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 
191 template <typename Scenario_T>
192 bool hasPreviousIntervals(const IntervalModel& tn, const Scenario_T& scenario)
193 {
194  const EventModel& event = startEvent(tn, scenario);
195  return hasPreviousIntervals(event, scenario);
196 }
197 
198 template <typename Scenario_T>
199 bool hasNextIntervals(const IntervalModel& tn, const Scenario_T& scenario)
200 {
201  const EventModel& event = endEvent(tn, scenario);
202  return hasNextIntervals(event, scenario);
203 }
204 
205 template <typename Scenario_T>
206 bool 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
222 template <typename Scenario_T>
223 std::list<Id<IntervalModel>>
224 nextIntervals(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 
237 template <typename Scenario_T>
238 std::list<Id<IntervalModel>>
239 nextNonGraphIntervals(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 
252 template <typename Scenario_T>
253 std::list<Id<IntervalModel>>
254 previousIntervals(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 
267 template <typename Scenario_T>
268 std::list<Id<IntervalModel>>
269 previousNonGraphIntervals(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 
282 template <typename Scenario_T>
283 bool 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 
295 template <typename Scenario_T>
296 bool 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 
308 template <typename Scenario_T>
309 std::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
324 template <typename Element_T, typename Scenario_T>
325 const TimeVal& date(const Element_T& e, const Scenario_T& scenario)
326 {
327  return parentTimeSync(e, scenario).date();
328 }
329 template <typename Scenario_T>
330 inline const TimeVal& date(const IntervalModel& e, const Scenario_T& scenario)
331 {
332  return e.date();
333 }
334 
335 template <typename Element_T>
336 Scenario::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:14
Definition: TimeValue.hpp:21