Skip to content

Commit 1ce4448

Browse files
committed
add frame-span and frame-range serialization helpers
1 parent b53778a commit 1ce4448

10 files changed

Lines changed: 309 additions & 1 deletion

src/Backdash/Serialization/BinaryBufferReader.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,18 @@ public DateTimeOffset ReadDateTimeOffset()
264264
/// <inheritdoc cref="ReadFrame()" />
265265
public Frame? ReadNullableFrame() => ReadBoolean() ? ReadFrame() : null;
266266

267+
/// <summary>Reads single <see cref="FrameSpan" /> from the buffer.</summary>
268+
public FrameSpan ReadFrameSpan() => ReadAsInt32<FrameSpan>();
269+
270+
/// <inheritdoc cref="ReadFrameSpan()" />
271+
public FrameSpan? ReadNullableFrameSpan() => ReadBoolean() ? ReadFrameSpan() : null;
272+
273+
/// <summary>Reads single <see cref="FrameRange" /> from the buffer.</summary>
274+
public FrameRange ReadFrameRange() => ReadAsInt64<FrameRange>();
275+
276+
/// <inheritdoc cref="ReadFrameRange()" />
277+
public FrameRange? ReadNullableFrameRange() => ReadBoolean() ? ReadFrameRange() : null;
278+
267279
/// <summary>Reads single <see cref="Checksum" /> from the buffer.</summary>
268280
public Checksum ReadChecksum() => ReadAsUInt32<Checksum>();
269281

@@ -698,9 +710,21 @@ public void Read(in StringBuilder values)
698710
/// <inheritdoc cref="ReadFrame()" />
699711
public void Read(ref Frame value) => value = ReadFrame();
700712

701-
/// <inheritdoc cref="ReadTimeOnly()" />
713+
/// <inheritdoc cref="ReadFrame()" />
702714
public void Read(ref Frame? value) => value = ReadNullableFrame();
703715

716+
/// <inheritdoc cref="ReadFrameSpan()" />
717+
public void Read(ref FrameSpan value) => value = ReadFrameSpan();
718+
719+
/// <inheritdoc cref="ReadFrameSpan()" />
720+
public void Read(ref FrameSpan? value) => value = ReadNullableFrameSpan();
721+
722+
/// <inheritdoc cref="ReadFrameRange()" />
723+
public void Read(ref FrameRange value) => value = ReadFrameRange();
724+
725+
/// <inheritdoc cref="ReadFrameRange()" />
726+
public void Read(ref FrameRange? value) => value = ReadNullableFrameRange();
727+
704728
/// <inheritdoc cref="ReadChecksum()" />
705729
public void Read(ref Checksum value) => value = ReadChecksum();
706730

@@ -936,6 +960,26 @@ public void Read(in Span<Frame> values)
936960
/// <summary>Reads a list of <see cref="Frame" /> from buffer into <paramref name="values" />.</summary>
937961
public void Read(in List<Frame> values) => Read(GetListSpan(in values));
938962

963+
/// <summary>Reads a span of <see cref="FrameSpan" /> from buffer into <paramref name="values" />.</summary>
964+
public void Read(in Span<FrameSpan> values)
965+
{
966+
if (values.IsEmpty) return;
967+
Read(MemoryMarshal.Cast<FrameSpan, int>(values));
968+
}
969+
970+
/// <summary>Reads a list of <see cref="FrameSpan" /> from buffer into <paramref name="values" />.</summary>
971+
public void Read(in List<FrameSpan> values) => Read(GetListSpan(in values));
972+
973+
/// <summary>Reads a span of <see cref="FrameRange" /> from buffer into <paramref name="values" />.</summary>
974+
public void Read(in Span<FrameRange> values)
975+
{
976+
if (values.IsEmpty) return;
977+
Read(MemoryMarshal.Cast<FrameRange, long>(values));
978+
}
979+
980+
/// <summary>Reads a list of <see cref="FrameRange" /> from buffer into <paramref name="values" />.</summary>
981+
public void Read(in List<FrameRange> values) => Read(GetListSpan(in values));
982+
939983
/// <summary>Reads a span of <see cref="Checksum" /> from buffer into <paramref name="values" />.</summary>
940984
public void Read(in Span<Checksum> values)
941985
{

src/Backdash/Serialization/BinaryBufferWriter.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ public void Write(in DateTimeOffset value)
178178
/// <summary>Writes single <see cref="Checksum" /> <paramref name="value" /> into buffer.</summary>
179179
public void Write(in Checksum value) => WriteAsUInt32(in value);
180180

181+
/// <summary>Writes single <see cref="FrameSpan" /> <paramref name="value" /> into buffer.</summary>
182+
public void Write(in FrameSpan value) => WriteAsInt32(in value);
183+
184+
/// <summary>Writes single <see cref="FrameRange" /> <paramref name="value" /> into buffer.</summary>
185+
public void Write(in FrameRange value) => WriteAsInt64(in value);
186+
181187
#region Nullable Values
182188

183189
/// <inheritdoc cref="Write(in byte)" />
@@ -319,6 +325,22 @@ public void Write(in Checksum? value)
319325
Write(in Nullable.GetValueRefOrDefaultRef(in value));
320326
}
321327

328+
/// <inheritdoc cref="Write(in FrameSpan)" />
329+
public void Write(in FrameSpan? value)
330+
{
331+
Write(value.HasValue);
332+
if (value.HasValue)
333+
Write(in Nullable.GetValueRefOrDefaultRef(in value));
334+
}
335+
336+
/// <inheritdoc cref="Write(in FrameRange)" />
337+
public void Write(in FrameRange? value)
338+
{
339+
Write(value.HasValue);
340+
if (value.HasValue)
341+
Write(in Nullable.GetValueRefOrDefaultRef(in value));
342+
}
343+
322344
#endregion
323345

324346
/// <summary>Writes a span bytes of <see cref="byte" /> <paramref name="value" /> into buffer.</summary>
@@ -524,6 +546,12 @@ public void Write(in ReadOnlySpan<DateTimeOffset> values)
524546
/// <summary>Writes a span of <see cref="Checksum" /> <paramref name="values" /> into buffer.</summary>
525547
public void Write(in ReadOnlySpan<Checksum> values) => Write(MemoryMarshal.Cast<Checksum, uint>(values));
526548

549+
/// <summary>Writes a span of <see cref="FrameSpan" /> <paramref name="values" /> into buffer.</summary>
550+
public void Write(in ReadOnlySpan<FrameSpan> values) => Write(MemoryMarshal.Cast<FrameSpan, int>(values));
551+
552+
/// <summary>Writes a span of <see cref="FrameRange" /> <paramref name="values" /> into buffer.</summary>
553+
public void Write(in ReadOnlySpan<FrameRange> values) => Write(MemoryMarshal.Cast<FrameRange, long>(values));
554+
527555
#region Lists
528556

529557
/// <summary>Writes a list of <see cref="byte" /> <paramref name="values" /> into buffer.</summary>
@@ -595,6 +623,12 @@ public void Write(in ReadOnlySpan<DateTimeOffset> values)
595623
/// <summary>Writes a list <see cref="Checksum" /> <paramref name="values" /> into buffer.</summary>
596624
public void Write(in List<Checksum> values) => Write(GetListSpan(in values));
597625

626+
/// <summary>Writes a list <see cref="FrameSpan" /> <paramref name="values" /> into buffer.</summary>
627+
public void Write(in List<FrameSpan> values) => Write(GetListSpan(in values));
628+
629+
/// <summary>Writes a list <see cref="FrameRange" /> <paramref name="values" /> into buffer.</summary>
630+
public void Write(in List<FrameRange> values) => Write(GetListSpan(in values));
631+
598632
#endregion
599633

600634
/// <summary>Writes a <see cref="IBinarySerializable" /> <paramref name="value" /> into buffer.</summary>

src/Backdash/Serialization/BinarySpanWriter.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ public void Write(in DateTimeOffset value)
187187
/// <summary>Writes single <see cref="Checksum" /> <paramref name="value" /> into buffer.</summary>
188188
public void Write(in Checksum value) => WriteAsUInt32(in value);
189189

190+
/// <summary>Writes single <see cref="FrameSpan" /> <paramref name="value" /> into buffer.</summary>
191+
public void Write(in FrameSpan value) => WriteAsInt32(in value);
192+
193+
/// <summary>Writes single <see cref="FrameRange" /> <paramref name="value" /> into buffer.</summary>
194+
public void Write(in FrameRange value) => WriteAsInt64(in value);
195+
190196
/// <summary>Writes a span of <see cref="byte" /> <paramref name="value" /> into buffer.</summary>
191197
public void Write(in ReadOnlySpan<byte> value)
192198
{
@@ -335,6 +341,22 @@ public void Write(in Checksum? value)
335341
Write(in Nullable.GetValueRefOrDefaultRef(in value));
336342
}
337343

344+
/// <inheritdoc cref="Write(in FrameSpan)" />
345+
public void Write(in FrameSpan? value)
346+
{
347+
Write(value.HasValue);
348+
if (value.HasValue)
349+
Write(in Nullable.GetValueRefOrDefaultRef(in value));
350+
}
351+
352+
/// <inheritdoc cref="Write(in FrameRange)" />
353+
public void Write(in FrameRange? value)
354+
{
355+
Write(value.HasValue);
356+
if (value.HasValue)
357+
Write(in Nullable.GetValueRefOrDefaultRef(in value));
358+
}
359+
338360
#endregion
339361

340362
/// <summary>Writes a span of <see cref="sbyte" /> <paramref name="value" /> into buffer.</summary>
@@ -484,6 +506,12 @@ public void Write(in ReadOnlySpan<DateTimeOffset> values)
484506
/// <summary>Writes a span of <see cref="Checksum" /> <paramref name="values" /> into buffer.</summary>
485507
public void Write(in ReadOnlySpan<Checksum> values) => Write(MemoryMarshal.Cast<Checksum, uint>(values));
486508

509+
/// <summary>Writes a span of <see cref="FrameSpan" /> <paramref name="values" /> into buffer.</summary>
510+
public void Write(in ReadOnlySpan<FrameSpan> values) => Write(MemoryMarshal.Cast<FrameSpan, int>(values));
511+
512+
/// <summary>Writes a span of <see cref="FrameRange" /> <paramref name="values" /> into buffer.</summary>
513+
public void Write(in ReadOnlySpan<FrameRange> values) => Write(MemoryMarshal.Cast<FrameRange, long>(values));
514+
487515
#region Lists
488516

489517
/// <summary>Writes a list of <see cref="byte" /> <paramref name="values" /> into buffer.</summary>
@@ -552,6 +580,15 @@ public void Write(in ReadOnlySpan<DateTimeOffset> values)
552580
/// <summary>Writes a list <see cref="Frame" /> <paramref name="values" /> into buffer.</summary>
553581
public void Write(in List<Frame> values) => Write(GetListSpan(in values));
554582

583+
/// <summary>Writes a list <see cref="Checksum" /> <paramref name="values" /> into buffer.</summary>
584+
public void Write(in List<Checksum> values) => Write(GetListSpan(in values));
585+
586+
/// <summary>Writes a list <see cref="FrameSpan" /> <paramref name="values" /> into buffer.</summary>
587+
public void Write(in List<FrameSpan> values) => Write(GetListSpan(in values));
588+
589+
/// <summary>Writes a list <see cref="FrameRange" /> <paramref name="values" /> into buffer.</summary>
590+
public void Write(in List<FrameRange> values) => Write(GetListSpan(in values));
591+
555592
#endregion
556593

557594
/// <summary>Writes an <see cref="string" /> <paramref name="value" /> into buffer as UTF8.</summary>

tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteListTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,42 @@ public bool ListOfFrame(List<Frame> value, Endianness endianness)
232232
return value.SequenceEqual(read);
233233
}
234234

235+
[PropertyTest]
236+
public bool ListOfFrameSpan(List<FrameSpan> value, Endianness endianness)
237+
{
238+
var size = Setup(value, endianness, out var writer);
239+
writer.Write(value);
240+
var reader = GetReader(writer);
241+
List<FrameSpan> read = [];
242+
reader.Read(in read);
243+
reader.ReadCount.Should().Be(size);
244+
return value.SequenceEqual(read);
245+
}
246+
247+
[PropertyTest]
248+
public bool ListOfFrameRange(List<FrameRange> value, Endianness endianness)
249+
{
250+
var size = Setup(value, endianness, out var writer);
251+
writer.Write(value);
252+
var reader = GetReader(writer);
253+
List<FrameRange> read = [];
254+
reader.Read(in read);
255+
reader.ReadCount.Should().Be(size);
256+
return value.SequenceEqual(read);
257+
}
258+
259+
[PropertyTest]
260+
public bool ListOfChecksum(List<Checksum> value, Endianness endianness)
261+
{
262+
var size = Setup(value, endianness, out var writer);
263+
writer.Write(value);
264+
var reader = GetReader(writer);
265+
List<Checksum> read = [];
266+
reader.Read(in read);
267+
reader.ReadCount.Should().Be(size);
268+
return value.SequenceEqual(read);
269+
}
270+
235271
[PropertyTest]
236272
public bool ListOfDateTime(List<DateTime> value, Endianness endianness)
237273
{

tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,28 @@ public bool TestFrame(Frame? value, Endianness endianness)
306306
return value == read;
307307
}
308308

309+
[PropertyTest]
310+
public bool TestFrameSpan(FrameSpan? value, Endianness endianness)
311+
{
312+
var size = Setup(value, endianness, out var writer);
313+
writer.Write(value);
314+
var reader = GetReader(writer);
315+
var read = reader.ReadNullableFrameSpan();
316+
reader.ReadCount.Should().Be(size);
317+
return value == read;
318+
}
319+
320+
[PropertyTest]
321+
public bool TestFrameRange(FrameRange? value, Endianness endianness)
322+
{
323+
var size = Setup(value, endianness, out var writer);
324+
writer.Write(value);
325+
var reader = GetReader(writer);
326+
var read = reader.ReadNullableFrameRange();
327+
reader.ReadCount.Should().Be(size);
328+
return value == read;
329+
}
330+
309331
[PropertyTest]
310332
public bool UnmanagedStruct(SimpleStructData? value, Endianness endianness)
311333
{

tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteSpanTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,30 @@ public bool SpanOfFrame(Frame[] value, Endianness endianness)
315315
return value.AsSpan().SequenceEqual(read);
316316
}
317317

318+
[PropertyTest]
319+
public bool SpanOfFrameSpan(FrameSpan[] value, Endianness endianness)
320+
{
321+
var size = Setup(value, endianness, out var writer);
322+
writer.Write(value);
323+
var reader = GetReader(writer);
324+
Span<FrameSpan> read = stackalloc FrameSpan[value.Length];
325+
reader.Read(in read);
326+
reader.ReadCount.Should().Be(size);
327+
return value.AsSpan().SequenceEqual(read);
328+
}
329+
330+
[PropertyTest]
331+
public bool SpanOfFrameRange(FrameRange[] value, Endianness endianness)
332+
{
333+
var size = Setup(value, endianness, out var writer);
334+
writer.Write(value);
335+
var reader = GetReader(writer);
336+
Span<FrameRange> read = stackalloc FrameRange[value.Length];
337+
reader.Read(in read);
338+
reader.ReadCount.Should().Be(size);
339+
return value.AsSpan().SequenceEqual(read);
340+
}
341+
318342
[PropertyTest]
319343
public bool SpanOfChecksum(Checksum[] value, Endianness endianness)
320344
{

tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteValueTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,28 @@ public bool TestFrame(Frame value, Frame read, Endianness endianness)
349349
return value == read;
350350
}
351351

352+
[PropertyTest]
353+
public bool TestFrameSpan(FrameSpan value, FrameSpan read, Endianness endianness)
354+
{
355+
var size = Setup<FrameSpan>(endianness, out var writer);
356+
writer.Write(value);
357+
var reader = GetReader(writer);
358+
reader.Read(ref read);
359+
reader.ReadCount.Should().Be(size);
360+
return value == read;
361+
}
362+
363+
[PropertyTest]
364+
public bool TestFrameRange(FrameRange value, FrameRange read, Endianness endianness)
365+
{
366+
var size = Setup<FrameRange>(endianness, out var writer);
367+
writer.Write(value);
368+
var reader = GetReader(writer);
369+
reader.Read(ref read);
370+
reader.ReadCount.Should().Be(size);
371+
return value == read;
372+
}
373+
352374
[PropertyTest]
353375
public bool TestChecksum(Checksum value, Checksum read, Endianness endianness)
354376
{

tests/Backdash.Tests/Specs/Unit/Serialization/BinarySpanReadWriteSpanTests.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,54 @@ public bool SpanOBooleans(bool[] value, Endianness endianness)
152152
return value.AsSpan().SequenceEqual(read);
153153
}
154154

155+
[PropertyTest]
156+
public bool SpanOFrame(Frame[] value, Endianness endianness)
157+
{
158+
var size = Setup(value, endianness, out var writer, out var reader);
159+
writer.Write(value);
160+
writer.WrittenCount.Should().Be(size);
161+
Span<Frame> read = stackalloc Frame[value.Length];
162+
reader.Read(read);
163+
reader.ReadCount.Should().Be(size);
164+
return value.AsSpan().SequenceEqual(read);
165+
}
166+
167+
[PropertyTest]
168+
public bool SpanOFrameSpan(FrameSpan[] value, Endianness endianness)
169+
{
170+
var size = Setup(value, endianness, out var writer, out var reader);
171+
writer.Write(value);
172+
writer.WrittenCount.Should().Be(size);
173+
Span<FrameSpan> read = stackalloc FrameSpan[value.Length];
174+
reader.Read(read);
175+
reader.ReadCount.Should().Be(size);
176+
return value.AsSpan().SequenceEqual(read);
177+
}
178+
179+
[PropertyTest]
180+
public bool SpanOFrameRange(FrameRange[] value, Endianness endianness)
181+
{
182+
var size = Setup(value, endianness, out var writer, out var reader);
183+
writer.Write(value);
184+
writer.WrittenCount.Should().Be(size);
185+
Span<FrameRange> read = stackalloc FrameRange[value.Length];
186+
reader.Read(read);
187+
reader.ReadCount.Should().Be(size);
188+
return value.AsSpan().SequenceEqual(read);
189+
}
190+
191+
[PropertyTest]
192+
public bool SpanOChecksum(Checksum[] value, Endianness endianness)
193+
{
194+
var size = Setup(value, endianness, out var writer, out var reader);
195+
writer.Write(value);
196+
writer.WrittenCount.Should().Be(size);
197+
Span<Checksum> read = stackalloc Checksum[value.Length];
198+
reader.Read(read);
199+
reader.ReadCount.Should().Be(size);
200+
return value.AsSpan().SequenceEqual(read);
201+
}
202+
155203
[PropertyTest]
156204
public bool SpanOfUtf8(NonEmptyString input, Endianness endianness)
157205
{

0 commit comments

Comments
 (0)