Skip to content

Commit

Permalink
Merge pull request #55 from SergeyMokin/change-add-range-array-to-cop…
Browse files Browse the repository at this point in the history
…y-to

Change add range array to copy to
  • Loading branch information
faustodavid committed Feb 11, 2020
2 parents aaacea7 + d1a219b commit 9644b2f
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 4 deletions.
17 changes: 15 additions & 2 deletions src/ListPool/ListPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,21 @@ public void AddRange(ReadOnlySpan<T> items)
Count += items.Length;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AddRange(T[] array) => AddRange(array.AsSpan());
public void AddRange(T[] array)
{
int count = Count;
T[] buffer = _buffer;

bool isCapacityEnough = buffer.Length - array.Length - count > 0;
if (!isCapacityEnough)
{
GrowBuffer(buffer.Length + array.Length);
buffer = _buffer;
}

array.CopyTo(buffer, count);
Count += array.Length;
}

public void AddRange(IEnumerable<T> items)
{
Expand Down
29 changes: 27 additions & 2 deletions src/ListPool/ValueListPool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,33 @@ public void AddRange(ReadOnlySpan<T> items)
Count += items.Length;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AddRange(T[] array) => AddRange(array.AsSpan());
public void AddRange(T[] array)
{
int count = Count;
T[] disposableBuffer = _disposableBuffer;
Span<T> buffer = _buffer;

bool isCapacityEnough = buffer.Length - array.Length - count > 0;
if (!isCapacityEnough)
{
GrowBuffer(buffer.Length + array.Length);
disposableBuffer = _disposableBuffer;
array.CopyTo(disposableBuffer, count);
Count += array.Length;
return;
}

if (disposableBuffer != null)
{
array.CopyTo(disposableBuffer, count);
}
else
{
array.AsSpan().CopyTo(buffer.Slice(count));
}

Count += array.Length;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public readonly Span<T> AsSpan() => _buffer.Slice(0, Count);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,29 @@ public override void Set_item_with_index_bellow_zero_throws_IndexOutOfRangeExcep
Assert.True(indexOutOfRangeExceptionThrown);
}

[Fact]
public void AddRange_from_array_adds_all_items_as_reference_pool()
{
int[] expectedValues = Enumerable.Range(0, 10).ToArray();

Span<int> initialValues = stackalloc int[5] { 11, 22, 33, 44, 55 };

using var sut = new ValueListPool<int>(initialValues, ValueListPool<int>.SourceType.UseAsReferenceData);

sut.AddRange(expectedValues);

Assert.Equal(expectedValues.Length + initialValues.Length, sut.Count);
foreach (int expectedValue in expectedValues)
{
Assert.True(sut.Contains(expectedValue));
}

foreach (int expectedValue in initialValues)
{
Assert.True(sut.Contains(expectedValue));
}
}

[Fact]
public void AddRange_adds_all_items()
{
Expand Down
23 changes: 23 additions & 0 deletions tests/ListPool.UnitTests/ValueListPool/ValueListPoolTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,29 @@ public override void Set_item_with_index_bellow_zero_throws_IndexOutOfRangeExcep
Assert.True(indexOutOfRangeExceptionThrown);
}

[Fact]
public void AddRange_from_array_adds_all_items_as_reference_pool()
{
int[] expectedValues = Enumerable.Range(0, 10).ToArray();

Span<int> initialValues = stackalloc int[5] { 11, 22, 33, 44, 55 };

using var sut = new ValueListPool<int>(initialValues, ValueListPool<int>.SourceType.UseAsReferenceData);

sut.AddRange(expectedValues);

Assert.Equal(expectedValues.Length + initialValues.Length, sut.Count);
foreach (int expectedValue in expectedValues)
{
Assert.True(sut.Contains(expectedValue));
}

foreach (int expectedValue in initialValues)
{
Assert.True(sut.Contains(expectedValue));
}
}

[Fact]
public void AddRange_adds_all_items()
{
Expand Down

0 comments on commit 9644b2f

Please sign in to comment.