Example #1
0
            /// <summary>
            /// Stores built automaton in pre-allocated <see cref="Automaton{TSequence,TElement,TElementDistribution,TSequenceManipulator,TThis}"/> object.
            /// </summary>
            public DataContainer GetData(
                DeterminizationState determinizationState = DeterminizationState.Unknown)
            {
                if (this.StartStateIndex < 0 || this.StartStateIndex >= this.states.Count)
                {
                    throw new InvalidOperationException(
                              $"Built automaton must have a valid start state. " +
                              $"StartStateIndex = {this.StartStateIndex}, states.Count = {this.states.Count}");
                }

                var hasEpsilonTransitions     = false;
                var usesGroups                = false;
                var resultStates              = new StateData[this.states.Count];
                var resultTransitions         = new Transition[this.transitions.Count - this.numRemovedTransitions];
                var nextResultTransitionIndex = 0;

                for (var i = 0; i < resultStates.Length; ++i)
                {
                    var firstResultTransitionIndex = nextResultTransitionIndex;
                    var transitionIndex            = this.states[i].FirstTransitionIndex;
                    while (transitionIndex != -1)
                    {
                        var node       = this.transitions[transitionIndex];
                        var transition = node.Transition;
                        Debug.Assert(
                            transition.DestinationStateIndex < resultStates.Length,
                            "Destination indexes must be in valid range");
                        resultTransitions[nextResultTransitionIndex] = transition;
                        ++nextResultTransitionIndex;
                        hasEpsilonTransitions = hasEpsilonTransitions || transition.IsEpsilon;
                        usesGroups            = usesGroups || (transition.Group != 0);

                        transitionIndex = node.Next;
                    }

                    resultStates[i] = new StateData(
                        firstResultTransitionIndex,
                        nextResultTransitionIndex - firstResultTransitionIndex,
                        this.states[i].EndWeight);
                }

                Debug.Assert(
                    nextResultTransitionIndex == resultTransitions.Length,
                    "number of copied transitions must match result array size");

                return(new DataContainer(
                           this.StartStateIndex,
                           !hasEpsilonTransitions,
                           usesGroups,
                           determinizationState,
                           resultStates,
                           resultTransitions));
            }
 public DataContainer(
     int startStateIndex,
     bool isEpsilonFree,
     bool usesGroups,
     DeterminizationState determinizationState,
     ReadOnlyArray <StateData> states,
     ReadOnlyArray <Transition> transitions)
 {
     this.flags =
         (isEpsilonFree ? Flags.IsEpsilonFree : 0) |
         (usesGroups ? Flags.UsesGroups : 0) |
         (determinizationState != DeterminizationState.Unknown ? Flags.DeterminizationStateKnown : 0) |
         (determinizationState == DeterminizationState.IsDeterminized ? Flags.IsDeterminized : 0);
     this.StartStateIndex = startStateIndex;
     this.States          = states;
     this.Transitions     = transitions;
 }