// Does segment1 contain all of matchBytes, or does it end with the start of matchBytes?
        // 1: AAAAABBBBBCCCCC
        // 2:      BBBBB
        // Or:
        // 1: AAAAABBB
        // 2:      BBBBB
        private bool SubMatch(ArraySegment <byte> segment1, byte[] matchBytes, out int matchOffset, out int matchCount)
        {
            // clear matchCount to zero
            matchCount = 0;

            // case 1: does segment1 fully contain matchBytes?
            {
                var matchBytesLengthMinusOne        = matchBytes.Length - 1;
                var matchBytesLastByte              = matchBytes[matchBytesLengthMinusOne];
                var segmentEndMinusMatchBytesLength = segment1.Offset + segment1.Count - matchBytes.Length;

                matchOffset = segment1.Offset;
                while (matchOffset < segmentEndMinusMatchBytesLength)
                {
                    var lookaheadTailChar = segment1.Array[matchOffset + matchBytesLengthMinusOne];
                    if (lookaheadTailChar == matchBytesLastByte &&
                        CompareBuffers(segment1.Array, matchOffset, matchBytes, 0, matchBytesLengthMinusOne) == 0)
                    {
                        matchCount = matchBytes.Length;
                        return(true);
                    }
                    matchOffset += _boundary.GetSkipValue(lookaheadTailChar);
                }
            }

            // case 2: does segment1 end with the start of matchBytes?
            var segmentEnd = segment1.Offset + segment1.Count;

            matchCount = 0;
            for (; matchOffset < segmentEnd; matchOffset++)
            {
                var countLimit = segmentEnd - matchOffset;
                for (matchCount = 0; matchCount < matchBytes.Length && matchCount < countLimit; matchCount++)
                {
                    if (matchBytes[matchCount] != segment1.Array[matchOffset + matchCount])
                    {
                        matchCount = 0;
                        break;
                    }
                }
                if (matchCount > 0)
                {
                    break;
                }
            }
            return(matchCount > 0);
        }