示例#1
0
        public StateMachine()
        {
            _statesMap   = new Dictionary <TState, StateContainer <TState> >();
            IsTransiting = false;

            CurrentState = null;
        }
示例#2
0
        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;
        }
示例#3
0
        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;
        }
示例#4
0
        public Transition <TState> this[StateContainer <TState> state]
        {
            get
            {
                if (!_transitionsMap.ContainsKey(state.Name))
                {
                    return(null);
                }

                return(_transitionsMap[state.Name]);
            }
        }
示例#5
0
        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));
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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;
            }
        }