示例#1
0
        public PlainStateMachine(IEqualityComparer <TState> stateComparer, IEqualityComparer <TTrigger> triggerComparer)
        {
            if (stateComparer == null)
            {
                throw new ArgumentNullException(nameof(stateComparer));
            }
            if (triggerComparer == null)
            {
                throw new ArgumentNullException(nameof(triggerComparer));
            }

            _stateComparer   = new StateEqualityComparer(stateComparer);
            _triggerComparer = new TriggerEqualityComparer(triggerComparer);

            _transitionEqualityComparer = new TransitionEqualityComparer(_stateComparer, _triggerComparer);

            _states                 = new Dictionary <TState, IState>(_stateComparer);
            _transitions            = new HashSet <Transition <TState, TTrigger> >(_transitionEqualityComparer);
            _guardConditions        = new Dictionary <Transition <TState, TTrigger>, List <IGuardCondition> >(_transitionEqualityComparer);
            _stateEventHandlers     = new Dictionary <TState, HashSet <IStateEventHandler> >(_stateComparer);
            _transitionCommandQueue = new Queue <TransitionCommand>();
        }
示例#2
0
        public PlainStateMachine(IEqualityComparer <TState> stateComparer, IEqualityComparer <TTrigger> triggerComparer)
        {
            if (stateComparer == null)
            {
                throw new ArgumentNullException(nameof(stateComparer));
            }
            if (triggerComparer == null)
            {
                throw new ArgumentNullException(nameof(triggerComparer));
            }

            _stateComparer   = new StateEqualityComparer(stateComparer);
            _triggerComparer = new TriggerEqualityComparer(triggerComparer);

            _transitionComparer = new TransitionEqualityComparer <TState, TTrigger>(_stateComparer, _triggerComparer);

            _states = new PlainStateCollection <TState, TTrigger>(this, _stateComparer);
            _transitionValidator     = new PlainTransitionValidator <TState, TTrigger>(this, _transitionComparer);
            _transitions             = new PlainTransitionCollection <TState, TTrigger>(this, _stateComparer, _transitionComparer);
            _stateBehaviourScheduler = new PlainStateBehaviourScheduler <TState, TTrigger>(this, _states, _transitions, _transitionValidator, _stateComparer, _triggerComparer);
            _eventHandlers           = new PlainStateEventHandlerCollection <TState, TTrigger>(this, _stateComparer);
            _eventDispatcher         = new PlainEventDispatcher <TState, TTrigger>(_eventHandlers, _stateBehaviourScheduler);
        }
示例#3
0
        private HashSet<State> GetLiveStates(HashSet<State> states)
        {
            var dictionary = states.ToDictionary(s => s, s => new HashSet<State>());

            foreach (State s in states)
            {
                foreach (Transition t in s.Transitions)
                {
                    // TODO: Java code does not check for null states.
                    if (t.To == null)
                    {
                        continue;
                    }

                    dictionary[t.To].Add(s);
                }
            }

            var comparer = new StateEqualityComparer();

            var live = new HashSet<State>(this.GetAcceptStates(), comparer);
            var worklist = new LinkedList<State>(live);
            while (worklist.Count > 0)
            {
                State s = worklist.RemoveAndReturnFirst();
                foreach (State p in dictionary[s])
                {
                    if (!live.Contains(p))
                    {
                        live.Add(p);
                        worklist.AddLast(p);
                    }
                }
            }

            return live;
        }