| File: Matching\TrieEvaluationDriver.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Core\Microsoft.TemplateEngine.Core.csproj (Microsoft.TemplateEngine.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace Microsoft.TemplateEngine.Core.Matching { public class TrieEvaluationDriver<T> where T : TerminalBase { private readonly TrieEvaluator<T> _evaluator; private int _sequenceNumber; public TrieEvaluationDriver(TrieEvaluator<T> trie) { _evaluator = trie; } public TerminalLocation<T>? Evaluate(byte[] buffer, int bufferLength, bool isFinalBuffer, int lastNetBufferEffect, ref int bufferPosition) { _sequenceNumber += lastNetBufferEffect; int sequenceNumberToBufferPositionRelationship = _sequenceNumber - bufferPosition; int originalSequenceNumber = _sequenceNumber; if (lastNetBufferEffect != 0 || !_evaluator.TryGetNext(isFinalBuffer && bufferPosition >= bufferLength, ref _sequenceNumber, out TerminalLocation<T>? terminal)) { while (!_evaluator.Accept(buffer[bufferPosition], ref _sequenceNumber, out terminal)) { ++_sequenceNumber; ++bufferPosition; if (bufferPosition >= bufferLength) { if (!isFinalBuffer) { break; } else { _evaluator.FinalizeMatchesInProgress(ref _sequenceNumber, out terminal); break; } } originalSequenceNumber = _sequenceNumber; } } if (terminal != null) { terminal.Location -= sequenceNumberToBufferPositionRelationship; if (originalSequenceNumber > _sequenceNumber + 1) { int expectedShift = terminal.Terminal.Length - terminal.Terminal.End - 1; if (expectedShift == 0) { int actualShift = originalSequenceNumber - _sequenceNumber - 1; bufferPosition -= actualShift; } } } return terminal; } } }