예제 #1
0
        // Starting at the current position, looks for pairs of locations in the _baselineData & _secondaryData that are byte-wise equivalent.
        // These are candidiates for where the difference ends.
        private Dictionary <int, List <int> > FindPotentialRealignments()
        {
            byte[]      baselineReplayBuffer = _baselineData.ReadBytes(DifferenceCheckWindowSize, out int baselineBytesRead);
            Span <byte> baselineSpan         = baselineReplayBuffer;

            // setup the baseline lookups
            Dictionary <string, IList <int> > baselinePositionals = new Dictionary <string, IList <int> >(StringComparer.Ordinal);

            for (int start = 0; start < baselineBytesRead - PositionalSize; start++)
            {
                Span <byte> slice       = baselineSpan.Slice(start, PositionalSize);
                string      sliceString = Encoding.Default.GetString(slice.ToArray());
                if (!baselinePositionals.TryGetValue(sliceString, out IList <int> positions))
                {
                    positions = new List <int>();
                    baselinePositionals[sliceString] = positions;
                }

                positions.Add(start);
            }

            byte[]      secondaryReplayBuffer = _secondaryData.ReadBytes(DifferenceCheckWindowSize, out int checkBytesRead);
            Span <byte> secondarySpan         = secondaryReplayBuffer;

            // start looking for "sames" in the check buffer
            Dictionary <int, List <int> > checkStartToBaselineStartMatches = new Dictionary <int, List <int> >();
            int finalCheckSliceStart = Math.Min(baselineBytesRead, checkBytesRead) - PositionalSize;

            for (int start = 0; start < finalCheckSliceStart; start++)
            {
                Span <byte> slice       = secondarySpan.Slice(start, PositionalSize);
                string      sliceString = Encoding.Default.GetString(slice.ToArray());
                if (baselinePositionals.TryGetValue(sliceString, out IList <int> baselineMatchPositions))
                {
                    if (!checkStartToBaselineStartMatches.TryGetValue(start, out List <int> baselineStartPositions))
                    {
                        baselineStartPositions = new List <int>();
                        checkStartToBaselineStartMatches[start] = baselineStartPositions;
                    }

                    baselineStartPositions.AddRange(baselineMatchPositions);
                }
            }

            _baselineData.SetupReplayBytes(baselineReplayBuffer);
            _secondaryData.SetupReplayBytes(secondaryReplayBuffer);

            return(checkStartToBaselineStartMatches);
        }