/// <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; }