DiaDes  0.1
DIAgnosis of Discrete-Event System
SynchronisationRules.hh
Go to the documentation of this file.
1 #ifndef __DIADES__AUTOMATA__SYNCHRONISATION__RULES__HH
2 #define __DIADES__AUTOMATA__SYNCHRONISATION__RULES__HH
3 
4 #include <numeric>
9 
10 
11 namespace Diades {
12  namespace Automata {
13 
21  public:
22  typedef vector<const Component *> ComponentVector;
23  typedef vector<Event> EventVector;
24 
25  private:
26  const ComponentVector * _pVect;
27  const EventVector * _pEvent;
28  ComponentVector::size_type _index;
29 
30  public:
31 
38  _ComponentIterator(const ComponentVector * pVect, const EventVector * pEvent,
39  ComponentVector::size_type index) : _pVect(pVect), _pEvent(pEvent), _index(index) {
40  }
41 
45  _ComponentIterator(const _ComponentIterator & it) : _pVect(it._pVect), _pEvent(it._pEvent), _index(it._index) {
46  }
47 
51  const Component & operator*() const {
52  return *(_pVect->operator[](_index));
53  }
54 
58  const Component * operator->() const {
59  return (_pVect->operator[](_index));
60  }
61 
66  ++_index;
67  return (*this);
68  }
69 
74  _ComponentIterator res(_pVect, _pEvent, _index + 1);
75  ++_index;
76  return res;
77  }
78 
82  bool operator==(const _ComponentIterator & compIt) const {
83  return (_pVect == compIt._pVect) && (_pEvent == compIt._pEvent)
84  && (_index == compIt._index);
85  }
86 
90  bool operator!=(const _ComponentIterator & compIt) const {
91  return !(*this == compIt);
92  }
93 
98  return (*_pEvent)[_index];
99  }
100 
104  ComponentVector::size_type index() const {
105  return _index;
106  }
107  };
108 
122  public:
123 
124  static string typeName() {
125  return "Automata::SynchronisationEvent";
126  }
128  typedef vector<const Component *> ComponentVector;
129  typedef vector<Event> EventVector;
130  typedef ComponentVector::size_type size_type;
134 
135  private:
136  ComponentVector _components;
137  ComponentVector _support;
138  EventVector _events;
139  EventVector _supportEvents;
141 
142  public:
143 
149  SynchronisationEvent(const ComponentVector & components);
150 
151 
161  SynchronisationEvent(const SynchronisationEvent & sync1, const SynchronisationEvent & sync2);
162 
163 
164 
174  SynchronisationEvent(const SynchronisationEvent & sync, const ComponentVector & components);
175 
180  _components(sync._components), _support(),
181  _events(sync._events),
182  _synchronised(sync._synchronised) {
183  }
184 
186  if (&sync != this) {
187  _components = sync._components;
188  _support = sync._support;
189  _events = sync._events;
190  _supportEvents = sync._supportEvents;
191  _synchronised = sync._synchronised;
192  }
193  return *this;
194  }
195 
199  ConstPointer getPointer() const {
200  return this;
201  }
202 
206  size_type size() const {
207  return _components.size();
208  }
209 
213  size_type supportSize() const {
214  return _support.size();
215  }
216 
222  bool isValid() const;
223 
232  ComponentIterator addEvent(const Component & component, Event e);
233 
239  const Event & synchronisedEvent() const {
240  require(Exception, isValid(), "The synchronisation event is invalid");
241  ensure(Exception, _synchronised.isValid(), "The returned synchronised event is invalid");
242  return _synchronised;
243  }
244 
248  ComponentIterator beginOfComponents() const {
249  return ComponentIterator(&_components, &_events, 0);
250  }
251 
255  ComponentIterator endOfComponents() const {
256  return ComponentIterator(&_components, &_events, _components.size());
257  }
258 
262  ComponentIterator beginOfSupport() const {
263  return ComponentIterator(&_support, &_supportEvents, 0);
264  }
265 
269  ComponentIterator endOfSupport() const {
270  return ComponentIterator(&_support, &_supportEvents, _support.size());
271  }
272 
276  Event getAssociatedEvent(const ComponentIterator & it) const {
277  return it.getAssociatedEvent();
278  }
279 
283  Event getAssociatedEvent(const Component & comp) const {
284  require(Exception, findComponent(comp) != endOfComponents(), "getAssociatedEvent: the component does not exist in the synchronisation event");
285  ComponentIterator it = findComponent(comp);
286  if (it == endOfComponents()) {
287  return Event();
288  }
289  return getAssociatedEvent(it);
290  }
291 
292 
297  ComponentIterator findComponent(const Component & component) const;
302  ComponentIterator findSupportComponent(const Component & component) const;
303 
307  bool operator==(const SynchronisationEvent & sync) const;
308  private:
317  void updateSynchroniseEvent();
318  };
319 
334  public:
335 
336  static string typeName() {
337  return "Automata::SynchronisationRules";
338  }
340  typedef vector<const Component *> ComponentVector;
341 
342 
343  protected:
344  ComponentVector _components;
345  list<SynchronisationEvent> _synchros;
346  public:
347  typedef ComponentVector::size_type size_type;
348  typedef list<SynchronisationEvent>::const_iterator SynchronisationIterator;
350 
351 
358  SynchronisationRules(const ComponentVector & components);
359 
362  SynchronisationRules() : _components(), _synchros() {
363  }
364 
369  void setComponentVector(const ComponentVector & components);
370 
374  SynchronisationIterator beginOfSynchronisedEvents() const {
375  return _synchros.begin();
376  }
377 
381  SynchronisationIterator endOfSynchronisedEvents() const {
382  return _synchros.end();
383  }
384 
388  size_type numberOfComponents() const {
389  return _components.size();
390  }
391 
395  size_type size() const {
396  return _synchros.size();
397  }
398 
402  ComponentIterator beginOfComponents() const {
403  return ComponentIterator(&_components, 0, 0);
404  }
405 
409  ComponentIterator endOfComponents() const {
410  return ComponentIterator(&_components, 0, _components.size());
411  }
412 
420  const Component & getComponent(size_type index) const {
421  require(Exception, index < numberOfComponents(),
422  Diades::Utils::Msg("getComponent: out-of-range index '%1% > %2%'")
423  % index % numberOfComponents());
424  return *_components[index];
425  }
426 
427 
433  ComponentIterator findComponent(const string & name) const;
434 
435 
441  ComponentIterator findComponent(const Component & component) const;
442 
446  bool operator==(const SynchronisationRules & rules) const {
447  return (_components == rules._components) && (_synchros == rules._synchros);
448  }
449 
458  void getSynchronisationEvents(const Component & component, Event event,
459  list< SynchronisationEvent::ConstPointer > & events) const;
460 
464  bool valid() const {
466  return !_components.empty() && accumulate(_synchros.begin(), _synchros.end(), true, AccValidity());
467  }
468 
484  friend ostream & operator<<(ostream & os, const SynchronisationRules & rules);
485 
486 
487  };
488 
496  public:
503  TwinPlantSynchronisation(const ComponentVector & components, const set<Event> & synchronisedEvents);
504  };
505 
511  public:
516  FreeProduct(const ComponentVector & components);
517  };
518 
529  private:
530  bool _locked;
531  set< set<Event> > _isSynchronized;
532  public:
538  ParametrizedSynchronisation(const ComponentVector & components);
539 
543  ParametrizedSynchronisation() : SynchronisationRules(), _locked(false), _isSynchronized() {
544  }
545 
546 
552  void init(const ComponentVector & components);
553 
554 
559  void synchronise(Event e);
560 
568  void synchronise(const vector<Event> & e);
580  void synchronise(const vector<Event> & e, bool relaxation);
581 
588  void close();
592  void open();
593 
597  bool isLocked() const {
598  return _locked;
599  }
600 
601 
605  void clear();
606 
607 
608 
609 
610  };
611 
612 
613  };
614 
615 };
616 
617 #endif
vector< const Component * > ComponentVector
_ComponentIterator(const _ComponentIterator &it)
list< SynchronisationEvent >::const_iterator SynchronisationIterator
SynchronisationEvent & operator=(const SynchronisationEvent &sync)
bool operator!=(const _ComponentIterator &compIt) const
Event getAssociatedEvent(const ComponentIterator &it) const
ComponentVector::size_type index() const
const Component & getComponent(size_type index) const
#define ensure(Exception, expr, message)
Definition: Assertion.hh:98
const SynchronisationEvent * ConstPointer
Diades::Utils::Exception< SynchronisationRules > Exception
vector< const Component * > ComponentVector
SynchronisationIterator beginOfSynchronisedEvents() const
Event getAssociatedEvent(const Component &comp) const
DdAutFsm::EventPropertyId Event
Definition: TrimState.cc:139
bool operator==(const _ComponentIterator &compIt) const
bool isValid() const
Definition: Event.hh:172
vector< const Component * > ComponentVector
#define require(Exception, expr, message)
Definition: Assertion.hh:90
Namespace of the Diades project.
Diades::Utils::Exception< SynchronisationEvent > Exception
SynchronisationEvent(const SynchronisationEvent &sync)
SynchronisationIterator endOfSynchronisedEvents() const
bool operator==(const SynchronisationRules &rules) const
_ComponentIterator(const ComponentVector *pVect, const EventVector *pEvent, ComponentVector::size_type index)
ostream & operator<<(ostream &os, const DiagState &dstate)
boost::format Msg
Definition: Verbose.hh:42