public StateMachine() { _statesMap = new Dictionary <TState, StateContainer <TState> >(); IsTransiting = false; CurrentState = null; }
public void AddTransition(StateContainer <TState> state) { if (_transitionsMap.ContainsKey(state.Name)) { throw new StateMachineException <TState>(ErrorCodes.AlreadyPresentArc, StateMachineException <TState> .MakeArcName(Name, state.Name)); } var transition = new Transition <TState>(this, state); _transitionsMap[state.Name] = transition; }
public void AddState(TState stateName) { if (this[stateName] != null) { throw new StateMachineException <TState>(ErrorCodes.AlreadyPresentState, stateName); } var state = new StateContainer <TState>(stateName); _statesMap[stateName] = state; }
public Transition <TState> this[StateContainer <TState> state] { get { if (!_transitionsMap.ContainsKey(state.Name)) { return(null); } return(_transitionsMap[state.Name]); } }
public Transition(StateContainer <TState> source, StateContainer <TState> target) { Source = source; Target = target; _transitCallbacks = new List <TransitionCallbackInvoker <TState> >(); if (IsUnlinked) { throw new StateMachineException <TState>(ErrorCodes.InvalidArc, StateMachineException <TState> .MakeArcName(source.Name, target.Name)); } }
public void AddTransition(TState source, TState target) { var sourceState = this[source]; if (sourceState == null) { throw new StateMachineException <TState>(ErrorCodes.UnknownState, source); } StateContainer <TState> targetState = this[target]; if (targetState == null) { throw new StateMachineException <TState>(ErrorCodes.UnknownState, target); } sourceState.AddTransition(targetState); }
public void GoToState(TState stateName) { try { if (IsTransiting) { throw new StateMachineException <TState>(ErrorCodes.AlreadyTransiting, stateName); } IsTransiting = true; OnTransiting(new TransitingEventArgs <TState>(stateName)); var target = this[stateName]; if (target == null) { throw new StateMachineException <TState>(ErrorCodes.UnknownState, stateName); } if (CurrentState != null) { var transition = CurrentState[target]; if (transition == null) { throw new StateMachineException <TState>(ErrorCodes.InvalidTransition, StateMachineException <TState> .MakeArcName(CurrentState.Name, target.Name)); } CurrentState.CallExitCallbacks(); transition.CallTransitionCallbacks(); } CurrentState = target; target.CallEnterCallbacks(); IsTransiting = false; OnTransited(new TransitedEventArgs <TState>(CurrentState.Name)); } catch { IsTransiting = false; throw; } }