internal InternalStateMachine(StateMachineFactory <Operand, State, Eventtype, Event > _enclosing, OPERAND operand, STATE initialState) { this._enclosing = _enclosing; this.operand = operand; this.currentState = initialState; if (!this._enclosing.optimized) { this._enclosing.MaybeMakeStateMachineTable(); } }
public virtual void Apply(StateMachineFactory <OPERAND, STATE, EVENTTYPE, EVENT> subject ) { IDictionary <EVENTTYPE, StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> > transitionMap = subject.stateMachineTable[preState]; if (transitionMap == null) { // I use HashMap here because I would expect most EVENTTYPE's to not // apply out of a particular state, so FSM sizes would be // quadratic if I use EnumMap's here as I do at the top level. transitionMap = new Dictionary <EVENTTYPE, StateMachineFactory.Transition <OPERAND, STATE, EVENTTYPE, EVENT> >(); subject.stateMachineTable[preState] = transitionMap; } transitionMap[eventType] = transition; }
/// <returns> /// a NEW StateMachineFactory just like /// <c>this</c> /// with the current /// transition added as a new legal transition /// Note that the returned StateMachineFactory is a distinct /// object. /// This method is part of the API. /// </returns> /// <param name="preState">pre-transition state</param> /// <param name="postState">post-transition state</param> /// <param name="eventTypes">List of stimuli for the transitions</param> /// <param name="hook">transition hook</param> public StateMachineFactory <OPERAND, STATE, EVENTTYPE, EVENT> AddTransition(STATE preState, STATE postState, ICollection <EVENTTYPE> eventTypes, SingleArcTransition <OPERAND, EVENT> hook) { StateMachineFactory <OPERAND, STATE, EVENTTYPE, EVENT> factory = null; foreach (EVENTTYPE @event in eventTypes) { if (factory == null) { factory = AddTransition(preState, postState, @event, hook); } else { factory = factory.AddTransition(preState, postState, @event, hook); } } return(factory); }