internal void SetTransfer(char i, StateTransfer transfer) { if (i < quickTransferLimit) { m_quickTransfers[i] = transfer; } else { m_Transfers.Add(i, transfer); } }
void EvolveState(SearchState pState) { Dictionary<char, SearchState> mapEvolvedStates = new Dictionary<char,SearchState>(); MultiMap<char, string> mapCompletedPatterns = new MultiMap<char, string>(); // move on each of the pattern strings we are currently following, incrementing the dotpos foreach (PatternState ps in pState.PatternStates) { if (ps.DotPos == ps.PatternString.Length) continue; char cBase = (ps.PatternString)[ps.DotPos]; if (m_target.CaseInsensitive) cBase = Char.ToUpper(cBase); List<char> cList = RedlineMLSearch.GetCharToMatchSpecial(cBase); if (cList != null) { foreach (char c in cList) { HandleCharEvolvingPattern(mapEvolvedStates, mapCompletedPatterns, ps, c); } } else { HandleCharEvolvingPattern(mapEvolvedStates, mapCompletedPatterns, ps, cBase); } } // add a new followed pattern for each of the root patterns (might start again here) foreach (string sPat in m_patterns) { Char cBase = sPat[0]; if (m_target.CaseInsensitive) cBase = Char.ToUpper(cBase); List<char> cList = RedlineMLSearch.GetCharToMatchSpecial(cBase); if (cList != null) { foreach (char c in cList) { HandleCharStartingPattern(mapEvolvedStates, mapCompletedPatterns, sPat, c); } } else { HandleCharStartingPattern(mapEvolvedStates, mapCompletedPatterns, sPat, cBase); } } // for all characters we are interested in, set the transfers from this state, linking back into existing states if they exist; foreach (Char c in mapEvolvedStates.Keys) { var transfer = new StateTransfer(); SearchState ss = mapEvolvedStates[c]; transfer.destState = FindOrInsertState(ss); // tag the patterns we complete with this step, if any transfer.acceptedPatterns = mapCompletedPatterns[c]; pState.SetTransfer(c, transfer); } }