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);
        }
示例#2
0
        /// <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));
 }