private List <IRule> LoadRule(IRule rule, ITransitionEvent data, ITransitionEventComparer comparer) { List <IRule> nextRules = new List <IRule>(); Stack <IRule> ruleStack = new Stack <IRule>(); ruleStack.Push(rule); int count = 0; while (ruleStack.Count > 0) { rule = ruleStack.Pop(); foreach (SCXMLTransition transition in rule.Transitions) { if ((count == 0 && comparer.Compare(transition.Event, data) > -1) || transition.Event == null) { SCXMLRule nextRule = PrepareRule(transition.TargetRuleName); nextRules.Add(nextRule); ruleStack.Push(nextRule); if (callback != null) { foreach (SCXMLDataEvent dataEvent in transition.DataEvents) { if (!dataEvent.IsTriggered) { callback.OnEvent(dataEvent); dataEvent.IsTriggered = true; } } } // TODO: Comment break to suppport NFA break; } } if (callback != null) { foreach (SCXMLDataEvent dataEvent in rule.DataEvents) { if (!dataEvent.IsTriggered) { callback.OnEvent(dataEvent); dataEvent.IsTriggered = true; } } } count++; } return(nextRules); }
/// <summary> /// <![CDATA[StateMachine<T> constructor]]> /// </summary> /// <param name="stateMachineInputComparer"><![CDATA[Custom IComparer<ITransitionEvent> object. /// User can use this object to define his own custom comparer to match the input with state transition events.]]></param> public StateMachine(ITransitionEventComparer stateMachineInputComparer, IOnStateChanged stateChangedCallback) { Config <T> .GetInstance().stateMachineInputComparer = stateMachineInputComparer; this.stateChangedCallback = stateChangedCallback; }
public SCXMLInterpreter() { scxmlTransitionEventComparer = new SCXMLTransitionEventComparer(); rulesDoc = new XmlDocument(); }
public List <IRule> LoadEvent <String>(IRule rule, ITransitionEvent data, ITransitionEventComparer comparer) { return(LoadRule(rule, data, comparer)); }