public static void LastIndexOfSequenceZeroLengthSpan_Byte()
 {
     Span<byte> span = new Span<byte>(EmptyArray<byte>.Instance);
     Span<byte> value = new Span<byte>(new byte[] { 1, 2, 3 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(-1, index);
 }
 public static void LastIndexOfSequenceJustPastVeryEnd_Byte()
 {
     Span<byte> span = new Span<byte>(new byte[] { 0, 1, 2, 3, 4, 5 }, 0, 5);
     Span<byte> value = new Span<byte>(new byte[] { 3, 4, 5 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(-1, index);
 }
 public static void LastIndexOfSequenceNotEvenAHeadMatch_Byte()
 {
     Span<byte> span = new Span<byte>(new byte[] { 0, 1, 77, 2, 3, 77, 77, 4, 5, 77, 77, 77, 88, 6, 6, 77, 77, 88, 9 });
     Span<byte> value = new Span<byte>(new byte[] { 100, 77, 88, 99 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(-1, index);
 }
 public static void LastIndexOfSequenceRestart_Byte()
 {
     Span<byte> span = new Span<byte>(new byte[] { 0, 1, 77, 2, 3, 77, 77, 4, 5, 77, 77, 77, 88, 6, 6, 77, 77, 8, 9, 77, 0, 1 });
     Span<byte> value = new Span<byte>(new byte[] { 77, 77, 88 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(10, index);
 }
 public static void LastIndexOfSequenceMultipleMatch_Byte()
 {
     Span<byte> span = new Span<byte>(new byte[] { 1, 2, 3, 1, 2, 3, 1, 2, 3, 1 });
     Span<byte> value = new Span<byte>(new byte[] { 2, 3 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(7, index);
 }
        public static void LastIndexOfSequenceZeroLengthSpan_Char()
        {
            Span <char> span  = new Span <char>(EmptyArray <char> .Instance);
            Span <char> value = new Span <char>(new char[] { '1', '2', '3' });
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(-1, index);
        }
        public static void LastIndexOfSequenceJustPastVeryEnd_Char()
        {
            Span <char> span  = new Span <char>(new char[] { '0', '1', '2', '3', '4', '5' }, 0, 5);
            Span <char> value = new Span <char>(new char[] { '3', '4', '5' });
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(-1, index);
        }
        public static void LastIndexOfSequenceNotEvenAHeadMatch_Char()
        {
            Span <char> span  = new Span <char>(new char[] { '0', '1', '7', '2', '3', '7', '7', '4', '5', '7', '7', '7', '8', '6', '6', '7', '7', '8', '9' });
            Span <char> value = new Span <char>(new char[] { 'X', '7', '8', '9' });
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(-1, index);
        }
        public static void LastIndexOfSequenceMultipleMatch_Char()
        {
            Span <char> span  = new Span <char>(new char[] { '1', '2', '3', '1', '2', '3', '1', '2', '3', '1' });
            Span <char> value = new Span <char>(new char[] { '2', '3' });
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(7, index);
        }
 public static void LastIndexOfSequenceLengthOneValue_Byte()
 {
     // A zero-length value is always "found" at the start of the span.
     Span<byte> span = new Span<byte>(new byte[] { 0, 1, 2, 3, 4, 5 });
     Span<byte> value = new Span<byte>(new byte[] { 2 });
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(2, index);
 }
 public static void LastIndexOfSequenceZeroLengthValue_Byte()
 {
     // A zero-length value is always "found" at the start of the span.
     Span<byte> span = new Span<byte>(new byte[] { 0, 1, 77, 2, 3, 77, 77, 4, 5, 77, 77, 77, 88, 6, 6, 77, 77, 88, 9 });
     Span<byte> value = new Span<byte>(EmptyArray<byte>.Instance);
     int index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);
     Assert.Equal(0, index);
 }
        public static void LastIndexOfSequenceZeroLengthValue_Char()
        {
            // A zero-length value is always "found" at the start of the span.
            Span <char> span  = new Span <char>(new char[] { '0', '1', '7', '2', '3', '7', '7', '4', '5', '7', '7', '7', '8', '6', '6', '7', '7', '8', '9' });
            Span <char> value = new Span <char>(EmptyArray <char> .Instance);
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(0, index);
        }
        public static void LastIndexOfSequenceLengthOneValueJustPasttVeryEnd_Char()
        {
            // A zero-length value is always "found" at the start of the span.
            Span <char> span  = new Span <char>(new char[] { '0', '1', '2', '3', '4', '5' }, 0, 5);
            Span <char> value = new Span <char>(new char[] { '5' });
            int         index = SpanHelpers.LastIndexOf(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(value), value.Length);

            Assert.Equal(-1, index);
        }
Example #14
0
        public int LastIndexOf(ICharSequence subString, int start)
        {
            int  thisLen  = this.length;
            uint uThisLen = (uint)thisLen;

            if (0u >= uThisLen)
            {
                return(IndexNotFound);
            }

            int subCount = subString.Count;

            start = Math.Min(start, thisLen - subCount);
            uint uStart = (uint)start;

            if (uStart > SharedConstants.TooBigOrNegative)
            {
                return(IndexNotFound);
            }
            if (0u >= (uint)subCount)
            {
                return(start);
            }

            if (subString is IHasAsciiSpan hasAscii)
            {
                return(SpanHelpers.LastIndexOf(
                           ref MemoryMarshal.GetReference(this.AsciiSpan), start + subCount,
                           ref MemoryMarshal.GetReference(hasAscii.AsciiSpan), subCount));
            }
            if (subString is IHasUtf16Span hasUtf16)
            {
                return(SpanHelpers.LastIndexOf(
                           ref MemoryMarshal.GetReference(this.Utf16Span), start + subCount,
                           ref MemoryMarshal.GetReference(hasUtf16.Utf16Span), subCount));
            }

            return(LastIndexOf0(subString, start));
        }