Skip to content

Commit 5fa4f6b

Browse files
committed
Fixed incorrect position within the buffer
1 parent bc96d79 commit 5fa4f6b

File tree

2 files changed

+80
-12
lines changed

2 files changed

+80
-12
lines changed

src/DotNext.Tests/Buffers/BufferWriterSlimTests.cs

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Immutable;
12
using System.Numerics;
23
using System.Text;
34
using static System.Globalization.CultureInfo;
@@ -18,15 +19,15 @@ public static void GrowableBuffer()
1819
Equal(2, builder.Capacity);
1920
Equal(2, builder.FreeCapacity);
2021

21-
builder.Write(stackalloc int[] { 10, 20 });
22+
builder.Write([10, 20]);
2223
Equal(2, builder.WrittenCount);
2324
Equal(2, builder.Capacity);
2425
Equal(0, builder.FreeCapacity);
2526

2627
Equal(10, builder[0]);
2728
Equal(20, builder[1]);
2829

29-
builder.Write(stackalloc int[] { 30, 40 });
30+
builder.Write([30, 40]);
3031
Equal(4, builder.WrittenCount);
3132
True(builder.Capacity >= 2);
3233
Equal(30, builder[2]);
@@ -38,17 +39,17 @@ public static void GrowableBuffer()
3839

3940
builder.Clear(true);
4041
Equal(0, builder.WrittenCount);
41-
builder.Write(stackalloc int[] { 50, 60, 70, 80 });
42+
builder.Write([50, 60, 70, 80]);
4243
Equal(4, builder.WrittenCount);
4344
True(builder.Capacity >= 2);
4445
Equal(50, builder[0]);
4546
Equal(60, builder[1]);
4647
Equal(70, builder[2]);
4748
Equal(80, builder[3]);
4849

49-
builder.Clear(false);
50+
builder.Clear();
5051
Equal(0, builder.WrittenCount);
51-
builder.Write(stackalloc int[] { 10, 20, 30, 40 });
52+
builder.Write([10, 20, 30, 40]);
5253
Equal(4, builder.WrittenCount);
5354
True(builder.Capacity >= 2);
5455
Equal(10, builder[0]);
@@ -454,4 +455,66 @@ public static void EncodeDecodeString(string encodingName, LengthFormat? format)
454455
Equal(expected, actual.Span);
455456
}
456457
}
458+
459+
[Fact]
460+
public static void AddList()
461+
{
462+
var writer = new BufferWriterSlim<int>();
463+
try
464+
{
465+
writer.AddAll(new List<int> { 1, 2 });
466+
Equal([1, 2], writer.WrittenSpan);
467+
}
468+
finally
469+
{
470+
writer.Dispose();
471+
}
472+
}
473+
474+
[Fact]
475+
public static void AddArray()
476+
{
477+
var writer = new BufferWriterSlim<int>();
478+
try
479+
{
480+
writer.AddAll([1, 2]);
481+
Equal([1, 2], writer.WrittenSpan);
482+
}
483+
finally
484+
{
485+
writer.Dispose();
486+
}
487+
}
488+
489+
[Fact]
490+
public static void AddString()
491+
{
492+
var writer = new BufferWriterSlim<char>();
493+
try
494+
{
495+
const string expected = "ab";
496+
writer.AddAll(expected);
497+
498+
Equal(expected, writer.WrittenSpan);
499+
}
500+
finally
501+
{
502+
writer.Dispose();
503+
}
504+
}
505+
506+
[Fact]
507+
public static void AddCountableCollection()
508+
{
509+
var writer = new BufferWriterSlim<int>();
510+
try
511+
{
512+
writer.AddAll(ImmutableList.Create(1, 2));
513+
Equal([1, 2], writer.WrittenSpan);
514+
}
515+
finally
516+
{
517+
writer.Dispose();
518+
}
519+
}
457520
}

src/DotNext/Buffers/BufferWriterSlim.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -362,24 +362,27 @@ public void AddAll(IEnumerable<T> collection)
362362
{
363363
ArgumentNullException.ThrowIfNull(collection);
364364

365+
ReadOnlySpan<T> input;
365366
switch (collection)
366367
{
367368
case List<T> list:
368-
Write(CollectionsMarshal.AsSpan(list));
369+
input = CollectionsMarshal.AsSpan(list);
369370
break;
370371
case T[] array:
371-
Write(new ReadOnlySpan<T>(array));
372+
input = array;
372373
break;
373374
case string str:
374-
Write(Unsafe.BitCast<ReadOnlyMemory<char>, ReadOnlyMemory<T>>(str.AsMemory()).Span);
375+
input = Unsafe.BitCast<ReadOnlyMemory<char>, ReadOnlyMemory<T>>(str.AsMemory()).Span;
375376
break;
376377
case ArraySegment<T> segment:
377-
Write(segment.AsSpan());
378+
input = segment;
378379
break;
379380
default:
380381
WriteSlow(collection);
381-
break;
382+
return;
382383
}
384+
385+
Write(input);
383386
}
384387

385388
private void WriteSlow(IEnumerable<T> collection)
@@ -388,10 +391,12 @@ private void WriteSlow(IEnumerable<T> collection)
388391
if (collection.TryGetNonEnumeratedCount(out var count))
389392
{
390393
var buffer = InternalGetSpan(count);
391-
for (var i = 0; i < buffer.Length && enumerator.MoveNext(); i++)
394+
for (count = 0; count < buffer.Length && enumerator.MoveNext(); count++)
392395
{
393-
buffer[i] = enumerator.Current;
396+
buffer[count] = enumerator.Current;
394397
}
398+
399+
position += count;
395400
}
396401

397402
while (enumerator.MoveNext())

0 commit comments

Comments
 (0)