From 08751478bf4b2f62680521fd01c351e34ed6ce77 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 28 Dec 2020 04:11:06 +0300 Subject: [PATCH 1/5] add test --- .../tests/StringSegmentTest.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs b/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs index 94d10cab10df34..313003617dc2d0 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/tests/StringSegmentTest.cs @@ -196,6 +196,17 @@ public void StringSegment_HasValue_Invalid() Assert.False(hasValue); } + [Fact] + public void StringSegment_NullBuffer_SearchingReturnMinusOne() + { + const char item = 'c'; + var segment = new StringSegment(); + + Assert.Equal(-1, segment.IndexOf(item)); + Assert.Equal(-1, segment.IndexOfAny(new[]{item})); + Assert.Equal(-1, segment.LastIndexOf(item)); + } + [Theory] [InlineData("a", 0, 1, 0, 'a')] [InlineData("abc", 1, 1, 0, 'b')] From 78926db4abfefa4d199749bf26a08a8fce26ddb8 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 28 Dec 2020 04:26:02 +0300 Subject: [PATCH 2/5] fix behavior --- .../src/StringSegment.cs | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs index 5ffb956f284c11..fd82e28be31ee7 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs @@ -427,21 +427,25 @@ public StringSegment Subsegment(int offset, int length) public int IndexOf(char c, int start, int count) { int offset = Offset + start; + int index = -1; - if (!HasValue || start < 0 || (uint)offset > (uint)Buffer.Length) + if (HasValue) { - ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.start); - } + if (start < 0 || (uint)offset > (uint)Buffer.Length) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.start); + } - if (count < 0) - { - ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count); - } + if (count < 0) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count); + } - int index = AsSpan().Slice(start, count).IndexOf(c); - if (index >= 0) - { - index += start; + index = AsSpan().Slice(start, count).IndexOf(c); + if (index != -1) + { + index -= Offset; + } } return index; From c2eef932cd4f66c8b7679d7b31a9f02fe1800e37 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 28 Dec 2020 14:24:50 +0300 Subject: [PATCH 3/5] little refact IsNullOrEmpty --- .../Microsoft.Extensions.Primitives/src/StringSegment.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs index fd82e28be31ee7..938dcd4a5f027d 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs @@ -617,14 +617,12 @@ public StringTokenizer Split(char[] chars) /// public static bool IsNullOrEmpty(StringSegment value) { - bool res = false; - if (!value.HasValue || value.Length == 0) { - res = true; + return true; } - return res; + return false; } /// From 9e6135d61fe3e23eea3cf3c33cf43e1f4ede331d Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 28 Dec 2020 14:24:50 +0300 Subject: [PATCH 4/5] Revert "little refact IsNullOrEmpty" This reverts commit 2dce6fa21fa3f86e9c0fb2fe555a8f1c2bb50d01. --- .../Microsoft.Extensions.Primitives/src/StringSegment.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs index 938dcd4a5f027d..fd82e28be31ee7 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs @@ -617,12 +617,14 @@ public StringTokenizer Split(char[] chars) /// public static bool IsNullOrEmpty(StringSegment value) { + bool res = false; + if (!value.HasValue || value.Length == 0) { - return true; + res = true; } - return false; + return res; } /// From 7e0181eec08a671a7d261314cb8860ed80773c65 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 20 Mar 2021 05:09:20 +0300 Subject: [PATCH 5/5] update method --- .../src/StringSegment.cs | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs index fd82e28be31ee7..b6300ec6afb104 100644 --- a/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs +++ b/src/libraries/Microsoft.Extensions.Primitives/src/StringSegment.cs @@ -427,25 +427,26 @@ public StringSegment Subsegment(int offset, int length) public int IndexOf(char c, int start, int count) { int offset = Offset + start; - int index = -1; - if (HasValue) + if (start < 0 || (uint)offset > (uint)Buffer.Length) { - if (start < 0 || (uint)offset > (uint)Buffer.Length) - { - ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.start); - } + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.start); + } - if (count < 0) - { - ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count); - } + if (count < 0) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.count); + } - index = AsSpan().Slice(start, count).IndexOf(c); - if (index != -1) - { - index -= Offset; - } + if (!HasValue) + { + return -1; + } + + int index = AsSpan().Slice(start, count).IndexOf(c); + if (index != -1) + { + index += start; } return index;