Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 1dc118c

Browse files
committed
Merge pull request #2090 from stephentoub/immut_array_removerange
Optimize ImmutableArray<T>.RemoveRange for 0/1 items input
2 parents 76a8088 + a1eaaf2 commit 1dc118c

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/System.Collections.Immutable/src/System/Collections/Immutable/ImmutableArray`1.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,11 @@ public ImmutableArray<T> RemoveRange(int index, int length)
756756
Requires.Range(index >= 0 && index < self.Length, "index");
757757
Requires.Range(length >= 0 && index + length <= self.Length, "length");
758758

759+
if (length == 0)
760+
{
761+
return self;
762+
}
763+
759764
T[] tmp = new T[self.Length - length];
760765
Array.Copy(self.array, 0, tmp, 0, index);
761766
Array.Copy(self.array, index + length, tmp, index, self.Length - index - length);
@@ -817,7 +822,7 @@ public ImmutableArray<T> RemoveRange(IEnumerable<T> items, IEqualityComparer<T>
817822
[Pure]
818823
public ImmutableArray<T> RemoveRange(ImmutableArray<T> items)
819824
{
820-
return this.RemoveRange(items.array);
825+
return this.RemoveRange(items, EqualityComparer<T>.Default);
821826
}
822827

823828
/// <summary>
@@ -833,7 +838,22 @@ public ImmutableArray<T> RemoveRange(ImmutableArray<T> items)
833838
[Pure]
834839
public ImmutableArray<T> RemoveRange(ImmutableArray<T> items, IEqualityComparer<T> equalityComparer)
835840
{
836-
return this.RemoveRange(items.array, equalityComparer);
841+
var self = this;
842+
Requires.NotNull(items.array, "items");
843+
844+
if (items.IsEmpty)
845+
{
846+
self.ThrowNullRefIfNotInitialized();
847+
return self;
848+
}
849+
else if (items.Length == 1)
850+
{
851+
return self.Remove(items[0], equalityComparer);
852+
}
853+
else
854+
{
855+
return self.RemoveRange(items.array, equalityComparer);
856+
}
837857
}
838858

839859
/// <summary>

src/System.Collections.Immutable/tests/ImmutableArrayTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,8 @@ public void RemoveRange()
853853
{
854854
Assert.Throws<ArgumentOutOfRangeException>(() => s_empty.RemoveRange(0, 0));
855855
Assert.Throws<NullReferenceException>(() => s_emptyDefault.RemoveRange(0, 0));
856+
Assert.Throws<ArgumentOutOfRangeException>(() => s_emptyDefault.RemoveRange(-1, 0));
857+
Assert.Throws<NullReferenceException>(() => s_emptyDefault.RemoveRange(0, -1));
856858
Assert.Throws<ArgumentOutOfRangeException>(() => s_oneElement.RemoveRange(1, 0));
857859
Assert.Throws<ArgumentOutOfRangeException>(() => s_empty.RemoveRange(-1, 0));
858860
Assert.Throws<ArgumentOutOfRangeException>(() => s_oneElement.RemoveRange(0, 2));
@@ -940,6 +942,35 @@ public void RemoveRangeEnumerableTest()
940942
Assert.Equal(new[] { 1, 3 }, listWithDuplicates.RemoveRange(new[] { 2, 2, 2 }));
941943
}
942944

945+
[Fact]
946+
public void RemoveRangeImmutableArrayTest()
947+
{
948+
var list = ImmutableArray.Create(1, 2, 3);
949+
950+
ImmutableArray<int> removed2 = list.RemoveRange(ImmutableArray.Create(2));
951+
Assert.Equal(2, removed2.Length);
952+
Assert.Equal(new[] { 1, 3 }, removed2);
953+
954+
ImmutableArray<int> removed13 = list.RemoveRange(ImmutableArray.Create(1, 3, 5));
955+
Assert.Equal(1, removed13.Length);
956+
Assert.Equal(new[] { 2 }, removed13);
957+
958+
Assert.Equal(new[] { 1, 3, 6, 8, 9 }, ImmutableArray.CreateRange(Enumerable.Range(1, 10)).RemoveRange(ImmutableArray.Create(2, 4, 5, 7, 10)));
959+
Assert.Equal(new[] { 3, 6, 8, 9 }, ImmutableArray.CreateRange(Enumerable.Range(1, 10)).RemoveRange(ImmutableArray.Create(1, 2, 4, 5, 7, 10)));
960+
961+
Assert.Equal(list, list.RemoveRange(ImmutableArray.Create(5)));
962+
Assert.Equal(ImmutableArray.Create<int>(), ImmutableArray.Create<int>().RemoveRange(ImmutableArray.Create(1)));
963+
964+
var listWithDuplicates = ImmutableArray.Create(1, 2, 2, 3);
965+
Assert.Equal(new[] { 1, 2, 3 }, listWithDuplicates.RemoveRange(ImmutableArray.Create(2)));
966+
Assert.Equal(new[] { 1, 3 }, listWithDuplicates.RemoveRange(ImmutableArray.Create(2, 2)));
967+
Assert.Equal(new[] { 1, 3 }, listWithDuplicates.RemoveRange(ImmutableArray.Create(2, 2, 2)));
968+
969+
Assert.Equal(new[] { 2, 3 }, list.RemoveRange(ImmutableArray.Create(42), EverythingEqual<int>.Default));
970+
Assert.Equal(new[] { 3 }, list.RemoveRange(ImmutableArray.Create(42, 42), EverythingEqual<int>.Default));
971+
Assert.Equal(new int[0], list.RemoveRange(ImmutableArray.Create(42, 42, 42), EverythingEqual<int>.Default));
972+
}
973+
943974
[Fact]
944975
public void Replace()
945976
{

0 commit comments

Comments
 (0)