DiaDes  0.1
DIAgnosis of Discrete-Event System
StateInserter.hh
Go to the documentation of this file.
1 
9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__STATEINSERTER__HH__
10 #define __DIADES__AUTOMATA__EXPERIMENTAL__STATEINSERTER__HH__
11 
13 
14 namespace Diades
15 {
16  namespace Automata
17  {
18  namespace Experimental
19  {
20 
21 
38  template<typename Fsm, typename _IdGenerator>
40  {
41  public:
45  using StateId = typename Fsm::StatePropertyId;
50  using IdGen = _IdGenerator;
51  private:
52 
62 
70  bool _rename;
71 
72  public:
73 
83  StateIdGenerator(const Fsm & target, IdGen & generator, bool rename) :
84  _target(Diades::Utils::Ptr<Fsm>::get(target)),
85  _generator(Diades::Utils::Ptr<IdGen>::get(generator)),
86  _rename(rename)
87  {
88  }
89 
98  StateId
99  generate(StateId sourceStateId)
100  {
101  if(_rename || (_target->getState(sourceStateId).valid()))
102  {
103  auto genStateId = _generator->another();
104  while(_target->getState(genStateId).valid())
105  {
106  genStateId = _generator->another();
107  }
108  return genStateId;
109  }
110  return sourceStateId;
111  }
112 
113  };
114 
132  template<typename _StateIdGenerator, typename _StateCreator>
134  {
135  public:
136 
137  using StateIdGenerator = _StateIdGenerator;
138  using StateCreator = _StateCreator;
139  using Fsm = typename StateCreator::Fsm;
140  using State = typename Fsm::State;
141  using StateId = typename Fsm::StatePropertyId;
142  using StateIdMap = std::unordered_map<StateId, StateId>;
143 
144  private:
148 
149  protected:
150 
151  State
153  {
154  return _creator->newState(state, id).first;
155  }
156 
157  public:
161  StateInserter() = default;
162 
163 
168  StateInserter(StateInserter const& other) = default;
174  StateInserter& operator=(StateInserter const& other) = default;
179  StateInserter(StateInserter&& other) = default;
185  StateInserter& operator=(StateInserter&& other) = default;
189  ~StateInserter() = default;
190 
199  _stateOf(),
200  _generator(Diades::Utils::Ptr<StateIdGenerator>::get(gen)),
201  _creator(Diades::Utils::Ptr<StateCreator>::get(creator))
202  {
203  }
204 
210  const Fsm &
211  source() const
212  {
213  return _creator->source();
214  }
215 
221  Fsm &
223  {
224  return _creator->target();
225  }
226 
236  virtual State
238  {
239  const auto & stateId = source().getStatePropertyId(state);
240  return newState(state, getStateId(stateId));
241  }
242 
252  virtual StateId
254  {
255  auto it = _stateOf.find(stateId);
256  if(it == _stateOf.end())
257  {
258  return _stateOf.emplace(stateId, _generator->generate(stateId)).first->second;
259  }
260  return it->second;
261  }
262  };
263 
264 
265 
276  template<typename _StateIdGenerator, typename _StateCreator, typename StateProperty>
277  class ManagedStateInserter: public StateInserter<_StateIdGenerator,_StateCreator>
278  {
279  public:
280 
281  using StateIdGenerator = _StateIdGenerator;
282  using StateCreator = _StateCreator;
283  using Fsm = typename StateCreator::Fsm;
284  using State = typename Fsm::State;
285  using StateId = typename Fsm::StatePropertyId;
286  using StateIdMap = std::unordered_map<StateId, StateId>;
289 
290  private:
293 
294  public:
298  ManagedStateInserter() = default;
299 
300 
305  ManagedStateInserter(ManagedStateInserter const& other) = default;
311  ManagedStateInserter& operator=(ManagedStateInserter const& other) = default;
316  ManagedStateInserter(ManagedStateInserter&& other) = default;
322  ManagedStateInserter& operator=(ManagedStateInserter&& other) = default;
326  ~ManagedStateInserter() = default;
327 
328 
330  StateCreator & creator,
331  const StManager & sManager,
332  StManager & tManager) :
333  StInserter(gen,creator),
334  _sourceStateManager(Diades::Utils::Ptr<StManager>::get(sManager)),
335  _targetStateManager(Diades::Utils::Ptr<StManager>::get(tManager))
336  {}
337 
347  virtual State
349  {
350  const auto & stateId = StInserter::source().getStatePropertyId(state);
351  if(_sourceStateManager->isNullId(stateId))
352  {
353  return StInserter::newState(state, StInserter::getStateId(stateId));
354  }
355  if(_sourceStateManager->hasStatePropertyId(stateId))
356  {
357  const auto & property = _sourceStateManager->getStateProperty(stateId);
358  if(_sourceStateManager->isNull(property))
359  {
360  return StInserter::newState(state, StInserter::getStateId(stateId));
361  }
362  else
363  {
364  if(_targetStateManager->hasStateProperty(property))
365  {
366  return StInserter::newState(state,_targetStateManager->statePropertyId(property));
367  }
368  else
369  {
370  return StInserter::newState(state, StInserter::getStateId(stateId));
371  }
372  }
373  }
374  return StInserter::newState(state, StInserter::getStateId(stateId));
375  }
376 
377 
378  };
379 
380 
381 
382 
383 
384  }
385  }
386 }
387 
388 
389 #endif /* __DIADES__AUTOMATA__EXPERIMENTAL__STATEINSERTER__HH__ */
390 
Diades::Utils::Ptr< Fsm >::ConstP _target
StateIdGenerator(const Fsm &target, IdGen &generator, bool rename)
const T * ConstP
Definition: Pointer.hh:31
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
StateInserter(StateIdGenerator &gen, StateCreator &creator)
AutFsm::State State
Definition: Run.cc:72
ManagedStateInserter(StateIdGenerator &gen, StateCreator &creator, const StManager &sManager, StManager &tManager)
Namespace of the Diades project.
Diades::Utils::Ptr< StateCreator >::P _creator
virtual StateId getStateId(StateId stateId)
Diades::Utils::Ptr< StManager >::P _targetStateManager
Diades::Utils::Ptr< StateIdGenerator >::P _generator
State::NodeId getStateId(const std::string &param, bool &ok)
Definition: Run.cc:362
std::unordered_map< StateId, StateId > StateIdMap
State newState(State state, StateId id)
Diades::Utils::Ptr< IdGen >::P _generator
Diades::Utils::Ptr< StManager >::ConstP _sourceStateManager