From 1dd797cbb25d9b9a93e604c5824ab9f87b148106 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 17:21:06 -0300 Subject: [PATCH 1/6] WIP --- .../Serialization/BinaryBufferReader.cs | 28 ++++++++++++- .../BinaryBufferReadWriteNullableValues.cs | 41 ++++++++++++++++++- .../TestUtils/Types/TestData.cs | 5 +++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/Backdash/Serialization/BinaryBufferReader.cs b/src/Backdash/Serialization/BinaryBufferReader.cs index e16ae346..e5fe30fc 100644 --- a/src/Backdash/Serialization/BinaryBufferReader.cs +++ b/src/Backdash/Serialization/BinaryBufferReader.cs @@ -1121,7 +1121,18 @@ public T ReadAsInt64() where T : unmanaged public void ReadAsInt64(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); /// - public void ReadAsInt64(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); + public void ReadAsInt64(ref T? value) where T : unmanaged + { + if (ReadBoolean()) + { + T res = new(); + ReadAsInt64(ref res); + value = res; + return; + } + + value = null; + } /// public void ReadAsInt64(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); @@ -1129,8 +1140,23 @@ public T ReadAsInt64() where T : unmanaged /// public void ReadAsInt64(in List values) where T : unmanaged => ReadAsInt64(GetListSpan(in values)); + /// + public void ReadEnum64(ref T? value) where T : unmanaged, Enum => Read(ref Unsafe.As(ref value)); + /// public T? ReadAsNullableInt64() where T : unmanaged + { + if (ReadBoolean()) + { + var value = ReadInt64(); + return Unsafe.As(ref value); + } + + return null; + } + + /// + public T? ReadAsNullableEnum64() where T : unmanaged, Enum { var value = ReadNullableInt64(); return Unsafe.As(ref value); diff --git a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs index 85ccac93..f61bbda0 100644 --- a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs +++ b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs @@ -809,11 +809,11 @@ public bool TestInt64(Int64Enum? value, Int64Enum? read, Endianness endianness) writer.WriteAsInt64(in value); var reader = GetReader(writer); - reader.ReadAsInt64(ref read); + reader.ReadEnum64(ref read); reader.ReadCount.Should().Be(size); ResetRead(); - var otherRead = reader.ReadAsNullableInt64(); + var otherRead = reader.ReadAsNullableEnum64(); reader.ReadCount.Should().Be(size); otherRead.Should().Be(read); @@ -873,6 +873,43 @@ public bool TestUInt128(UInt128Enum? value, UInt128Enum? read, Endianness endian return value == read; } + + [PropertyTest] + public void TestBagInt64Ref(Bag.PairInt32? value, Bag.PairInt32? read, Endianness endianness) + { + var size = Setup(value, endianness, out var writer); + writer.WriteAsInt64(in value); + + var reader = GetReader(writer); + reader.ReadAsInt64(ref read); + reader.ReadCount.Should().Be(size); + + ResetRead(); + Bag.PairInt32? otherRead = null; + reader.ReadAsInt64(ref otherRead); + reader.ReadCount.Should().Be(size); + otherRead.Should().Be(read); + + value.Should().BeEquivalentTo(read); + } + + [PropertyTest] + public void TestBagInt64(Bag.PairInt32? value, Bag.PairInt32? read, Endianness endianness) + { + var size = Setup(value, endianness, out var writer); + writer.WriteAsInt64(in value); + + var reader = GetReader(writer); + reader.ReadAsInt64(ref read); + reader.ReadCount.Should().Be(size); + + ResetRead(); + var otherRead = reader.ReadAsNullableInt64(); + reader.ReadCount.Should().Be(size); + otherRead.Should().Be(read); + + value.Should().BeEquivalentTo(read); + } } public static int Setup(T? value, Endianness endianness, out BinaryBufferWriter writer) where T : unmanaged diff --git a/tests/Backdash.Tests/TestUtils/Types/TestData.cs b/tests/Backdash.Tests/TestUtils/Types/TestData.cs index 8a428cdb..a22fe8dc 100644 --- a/tests/Backdash.Tests/TestUtils/Types/TestData.cs +++ b/tests/Backdash.Tests/TestUtils/Types/TestData.cs @@ -371,3 +371,8 @@ public enum Int64Enum : long public record struct Int128Enum(Int128 Value); public record struct UInt128Enum(UInt128 Value); + +public static class Bag +{ + public record struct PairInt32(int A, int B); +} From d0018ff1bd72890e536211d4381d36da8eb54c47 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 17:21:42 -0300 Subject: [PATCH 2/6] WIP --- src/Backdash/Serialization/BinaryBufferReader.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Backdash/Serialization/BinaryBufferReader.cs b/src/Backdash/Serialization/BinaryBufferReader.cs index e5fe30fc..8f3a767d 100644 --- a/src/Backdash/Serialization/BinaryBufferReader.cs +++ b/src/Backdash/Serialization/BinaryBufferReader.cs @@ -1120,6 +1120,12 @@ public T ReadAsInt64() where T : unmanaged /// public void ReadAsInt64(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); + /// + public void ReadAsInt64(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); + + /// + public void ReadAsInt64(in List values) where T : unmanaged => ReadAsInt64(GetListSpan(in values)); + /// public void ReadAsInt64(ref T? value) where T : unmanaged { @@ -1134,12 +1140,6 @@ public void ReadAsInt64(ref T? value) where T : unmanaged value = null; } - /// - public void ReadAsInt64(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); - - /// - public void ReadAsInt64(in List values) where T : unmanaged => ReadAsInt64(GetListSpan(in values)); - /// public void ReadEnum64(ref T? value) where T : unmanaged, Enum => Read(ref Unsafe.As(ref value)); From 798d149bba294cec4f53005f60260f14df9543e5 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 17:23:43 -0300 Subject: [PATCH 3/6] WIP --- src/Backdash/Serialization/BinaryBufferReader.cs | 8 ++++---- .../Serialization/BinaryBufferReadWriteNullableValues.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Backdash/Serialization/BinaryBufferReader.cs b/src/Backdash/Serialization/BinaryBufferReader.cs index 8f3a767d..ca331b43 100644 --- a/src/Backdash/Serialization/BinaryBufferReader.cs +++ b/src/Backdash/Serialization/BinaryBufferReader.cs @@ -1140,9 +1140,6 @@ public void ReadAsInt64(ref T? value) where T : unmanaged value = null; } - /// - public void ReadEnum64(ref T? value) where T : unmanaged, Enum => Read(ref Unsafe.As(ref value)); - /// public T? ReadAsNullableInt64() where T : unmanaged { @@ -1156,7 +1153,10 @@ public void ReadAsInt64(ref T? value) where T : unmanaged } /// - public T? ReadAsNullableEnum64() where T : unmanaged, Enum + public void ReadEnum64(ref T? value) where T : unmanaged, Enum => Read(ref Unsafe.As(ref value)); + + /// + public T? ReadNullableEnum64() where T : unmanaged, Enum { var value = ReadNullableInt64(); return Unsafe.As(ref value); diff --git a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs index f61bbda0..dcbc55d6 100644 --- a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs +++ b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs @@ -813,7 +813,7 @@ public bool TestInt64(Int64Enum? value, Int64Enum? read, Endianness endianness) reader.ReadCount.Should().Be(size); ResetRead(); - var otherRead = reader.ReadAsNullableEnum64(); + var otherRead = reader.ReadNullableEnum64(); reader.ReadCount.Should().Be(size); otherRead.Should().Be(read); From 96b5807912e201704e324aebe48ac8badccfec47 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 18:13:42 -0300 Subject: [PATCH 4/6] WIP --- .../Serialization/BinaryBufferReader.cs | 160 ++++++++++-------- .../BinaryBufferReadWriteNullableValues.cs | 26 +-- .../TestUtils/Types/TestData.cs | 2 +- 3 files changed, 97 insertions(+), 91 deletions(-) diff --git a/src/Backdash/Serialization/BinaryBufferReader.cs b/src/Backdash/Serialization/BinaryBufferReader.cs index ca331b43..ad4c16f1 100644 --- a/src/Backdash/Serialization/BinaryBufferReader.cs +++ b/src/Backdash/Serialization/BinaryBufferReader.cs @@ -963,20 +963,25 @@ public T ReadAsByte() where T : unmanaged /// public void ReadAsByte(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsByte(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsByte(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsByte(in List values) where T : unmanaged => ReadAsByte(GetListSpan(in values)); + /// + public void ReadAsByte(ref T? value) where T : unmanaged => value = ReadAsNullableByte(); + /// public T? ReadAsNullableByte() where T : unmanaged { - var value = ReadNullableByte(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadByte(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterprets it as . @@ -989,22 +994,26 @@ public T ReadAsSByte() where T : unmanaged /// public void ReadAsSByte(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsSByte(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsSByte(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsSByte(in List values) where T : unmanaged => ReadAsSByte(GetListSpan(in values)); + /// + public void ReadAsSByte(ref T? value) where T : unmanaged => value = ReadAsNullableSByte(); + /// public T? ReadAsNullableSByte() where T : unmanaged { - var value = ReadNullableSByte(); - return Unsafe.As(ref value); - } + if (ReadBoolean()) + { + var value = ReadSByte(); + return Unsafe.As(ref value); + } + return null; + } /// Reads a from buffer and reinterprets it as . public T ReadAsInt16() where T : unmanaged @@ -1016,20 +1025,25 @@ public T ReadAsInt16() where T : unmanaged /// public void ReadAsInt16(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsInt16(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsInt16(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsInt16(in List values) where T : unmanaged => ReadAsInt16(GetListSpan(in values)); + /// + public void ReadAsInt16(ref T? value) where T : unmanaged => value = ReadAsNullableInt16(); + /// public T? ReadAsNullableInt16() where T : unmanaged { - var value = ReadNullableInt16(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadInt16(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterprets it as . @@ -1042,20 +1056,25 @@ public T ReadAsUInt16() where T : unmanaged /// public void ReadAsUInt16(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsUInt16(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsUInt16(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsUInt16(in List values) where T : unmanaged => ReadAsUInt16(GetListSpan(in values)); + /// + public void ReadAsUInt16(ref T? value) where T : unmanaged => value = ReadAsNullableUInt16(); + /// public T? ReadAsNullableUInt16() where T : unmanaged { - var value = ReadNullableUInt16(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadUInt16(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterprets it as . @@ -1068,20 +1087,25 @@ public T ReadAsInt32() where T : unmanaged /// public void ReadAsInt32(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsInt32(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsInt32(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsInt32(in List values) where T : unmanaged => ReadAsInt32(GetListSpan(in values)); + /// + public void ReadAsInt32(ref T? value) where T : unmanaged => value = ReadAsNullableInt32(); + /// public T? ReadAsNullableInt32() where T : unmanaged { - var value = ReadNullableInt32(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadInt32(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterprets it as . @@ -1094,20 +1118,25 @@ public T ReadAsUInt32() where T : unmanaged /// public void ReadAsUInt32(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsUInt32(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsUInt32(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsUInt32(in List values) where T : unmanaged => ReadAsUInt32(GetListSpan(in values)); + /// + public void ReadAsUInt32(ref T? value) where T : unmanaged => value = ReadAsNullableUInt32(); + /// public T? ReadAsNullableUInt32() where T : unmanaged { - var value = ReadNullableUInt32(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadUInt32(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterpret it as . @@ -1127,18 +1156,7 @@ public T ReadAsInt64() where T : unmanaged public void ReadAsInt64(in List values) where T : unmanaged => ReadAsInt64(GetListSpan(in values)); /// - public void ReadAsInt64(ref T? value) where T : unmanaged - { - if (ReadBoolean()) - { - T res = new(); - ReadAsInt64(ref res); - value = res; - return; - } - - value = null; - } + public void ReadAsInt64(ref T? value) where T : unmanaged => value = ReadAsNullableInt64(); /// public T? ReadAsNullableInt64() where T : unmanaged @@ -1152,16 +1170,6 @@ public void ReadAsInt64(ref T? value) where T : unmanaged return null; } - /// - public void ReadEnum64(ref T? value) where T : unmanaged, Enum => Read(ref Unsafe.As(ref value)); - - /// - public T? ReadNullableEnum64() where T : unmanaged, Enum - { - var value = ReadNullableInt64(); - return Unsafe.As(ref value); - } - /// Reads a from buffer and reinterprets it as . public T ReadAsUInt64() where T : unmanaged { @@ -1172,20 +1180,25 @@ public T ReadAsUInt64() where T : unmanaged /// public void ReadAsUInt64(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsUInt64(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsUInt64(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsUInt64(in List values) where T : unmanaged => ReadAsUInt64(GetListSpan(in values)); + /// + public void ReadAsUInt64(ref T? value) where T : unmanaged => value = ReadAsNullableUInt64(); + /// public T? ReadAsNullableUInt64() where T : unmanaged { - var value = ReadNullableUInt64(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadUInt64(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterpret it as . @@ -1198,20 +1211,26 @@ public T ReadAsInt128() where T : unmanaged /// public void ReadAsInt128(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsInt128(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsInt128(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsInt128(in List values) where T : unmanaged => ReadAsInt128(GetListSpan(in values)); + + /// + public void ReadAsInt128(ref T? value) where T : unmanaged => value = ReadAsNullableInt128(); + /// public T? ReadAsNullableInt128() where T : unmanaged { - var value = ReadNullableInt128(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadInt128(); + return Unsafe.As(ref value); + } + + return null; } /// Reads a from buffer and reinterprets it as . @@ -1224,19 +1243,24 @@ public T ReadAsUInt128() where T : unmanaged /// public void ReadAsUInt128(ref T value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// - public void ReadAsUInt128(ref T? value) where T : unmanaged => Read(ref Unsafe.As(ref value)); - /// public void ReadAsUInt128(in Span values) where T : unmanaged => Read(MemoryMarshal.Cast(values)); /// public void ReadAsUInt128(in List values) where T : unmanaged => ReadAsUInt128(GetListSpan(in values)); + /// + public void ReadAsUInt128(ref T? value) where T : unmanaged => value = ReadAsNullableUInt128(); + /// public T? ReadAsNullableUInt128() where T : unmanaged { - var value = ReadNullableUInt128(); - return Unsafe.As(ref value); + if (ReadBoolean()) + { + var value = ReadUInt128(); + return Unsafe.As(ref value); + } + + return null; } } diff --git a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs index dcbc55d6..13c5024e 100644 --- a/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs +++ b/tests/Backdash.Tests/Specs/Unit/Serialization/BinaryBufferReadWriteNullableValues.cs @@ -809,11 +809,11 @@ public bool TestInt64(Int64Enum? value, Int64Enum? read, Endianness endianness) writer.WriteAsInt64(in value); var reader = GetReader(writer); - reader.ReadEnum64(ref read); + reader.ReadAsInt64(ref read); reader.ReadCount.Should().Be(size); ResetRead(); - var otherRead = reader.ReadNullableEnum64(); + var otherRead = reader.ReadAsNullableInt64(); reader.ReadCount.Should().Be(size); otherRead.Should().Be(read); @@ -875,7 +875,7 @@ public bool TestUInt128(UInt128Enum? value, UInt128Enum? read, Endianness endian } [PropertyTest] - public void TestBagInt64Ref(Bag.PairInt32? value, Bag.PairInt32? read, Endianness endianness) + public void TestBagInt64Ref(Bag.S8? value, Bag.S8? read, Endianness endianness) { var size = Setup(value, endianness, out var writer); writer.WriteAsInt64(in value); @@ -885,31 +885,13 @@ public void TestBagInt64Ref(Bag.PairInt32? value, Bag.PairInt32? read, Endiannes reader.ReadCount.Should().Be(size); ResetRead(); - Bag.PairInt32? otherRead = null; + Bag.S8? otherRead = null; reader.ReadAsInt64(ref otherRead); reader.ReadCount.Should().Be(size); otherRead.Should().Be(read); value.Should().BeEquivalentTo(read); } - - [PropertyTest] - public void TestBagInt64(Bag.PairInt32? value, Bag.PairInt32? read, Endianness endianness) - { - var size = Setup(value, endianness, out var writer); - writer.WriteAsInt64(in value); - - var reader = GetReader(writer); - reader.ReadAsInt64(ref read); - reader.ReadCount.Should().Be(size); - - ResetRead(); - var otherRead = reader.ReadAsNullableInt64(); - reader.ReadCount.Should().Be(size); - otherRead.Should().Be(read); - - value.Should().BeEquivalentTo(read); - } } public static int Setup(T? value, Endianness endianness, out BinaryBufferWriter writer) where T : unmanaged diff --git a/tests/Backdash.Tests/TestUtils/Types/TestData.cs b/tests/Backdash.Tests/TestUtils/Types/TestData.cs index a22fe8dc..3280cca7 100644 --- a/tests/Backdash.Tests/TestUtils/Types/TestData.cs +++ b/tests/Backdash.Tests/TestUtils/Types/TestData.cs @@ -374,5 +374,5 @@ public record struct UInt128Enum(UInt128 Value); public static class Bag { - public record struct PairInt32(int A, int B); + public record struct S8(int A, int B); } From 55f51721526f0ead9b06d25ee4dc4659305cfa59 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 18:48:28 -0300 Subject: [PATCH 5/6] WIP --- .../SourceGenerationHelper.cs | 17 +++++++--- .../Serialization/BinaryBufferReader.cs | 33 ++++++++----------- .../Internal/EndiannessSerializer.cs | 20 +++++++++++ 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/Backdash.Analyzers/SourceGenerationHelper.cs b/src/Backdash.Analyzers/SourceGenerationHelper.cs index 33e2dcc8..3841996e 100644 --- a/src/Backdash.Analyzers/SourceGenerationHelper.cs +++ b/src/Backdash.Analyzers/SourceGenerationHelper.cs @@ -82,10 +82,11 @@ void BuildValueMember(ClassMember member) ); reads.Append(tab2); + reads.AppendLine( member.Type is INamedTypeSymbol { EnumUnderlyingType: { } underTypeRead } - ? $"result.{member.Name} = ({member.Type.Name})binaryReader.Read{underTypeRead.Name}();" - : $"result.{member.Name} = binaryReader.Read{member.Type.Name}();" + ? $"result.{member.Name} = ({member.Type.Name})binaryReader.Read{GetMethodSuffix(underTypeRead)}();" + : $"result.{member.Name} = binaryReader.Read{GetMethodSuffix(member.Type)}();" ); } } @@ -145,8 +146,8 @@ void BuildArrayMember(ITypeSymbol itemType, ClassMember member) reads.Append(tab3); reads.AppendLine( itemType is INamedTypeSymbol { EnumUnderlyingType: { } underTypeRead } - ? $"result.{member.Name}[i] = ({itemType.Name})binaryReader.Read{underTypeRead.Name}();" - : $"result.{member.Name}[i] = binaryReader.Read{itemType.Name}();" + ? $"result.{member.Name}[i] = ({itemType.Name})binaryReader.Read{GetMethodSuffix(underTypeRead)}();" + : $"result.{member.Name}[i] = binaryReader.Read{GetMethodSuffix(itemType)}();" ); } @@ -158,6 +159,14 @@ void BuildArrayMember(ITypeSymbol itemType, ClassMember member) } } + static string GetMethodSuffix(ITypeSymbol type) + { + if (type.Name is "Single") + return "Float"; + + return type.Name; + } + static bool IsArrayLike(ITypeSymbol memberType, out ITypeSymbol elementType) { elementType = memberType; diff --git a/src/Backdash/Serialization/BinaryBufferReader.cs b/src/Backdash/Serialization/BinaryBufferReader.cs index ad4c16f1..92b175ec 100644 --- a/src/Backdash/Serialization/BinaryBufferReader.cs +++ b/src/Backdash/Serialization/BinaryBufferReader.cs @@ -196,16 +196,6 @@ public bool ReadBoolean() /// public Half? ReadNullableHalf() => ReadBoolean() ? ReadHalf() : null; - /// - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public float ReadSingle() => ReadFloat(); - - /// - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public float? ReadNullableSingle() => ReadNullableFloat(); - /// Reads float 32 from the buffer. public float ReadFloat() => BitConverter.Int32BitsToSingle(ReadInt32()); @@ -353,8 +343,11 @@ public T ReadNumber(bool isUnsigned) where T : unmanaged, IBinaryInteger } /// - public void ReadNumber(ref T value, bool isUnsigned) where T : unmanaged, IBinaryInteger => - value = ReadNumber(isUnsigned); + public void ReadNumber(ref T value, bool isUnsigned) where T : unmanaged, IBinaryInteger + { + numberSerializer.Read(ref value, CurrentBuffer, isUnsigned, out var written); + Advance(written); + } /// public void ReadNumber(ref T? value, bool isUnsigned) where T : unmanaged, IBinaryInteger => @@ -595,13 +588,13 @@ public void Read(in StringBuilder values) public void Read(ref bool? value) => value = ReadNullableBoolean(); /// - public void Read(ref short value) => value = ReadInt16(); + public void Read(ref short value) => ReadNumber(ref value, false); /// public void Read(ref short? value) => value = ReadNullableInt16(); /// - public void Read(ref ushort value) => value = ReadUInt16(); + public void Read(ref ushort value) => ReadNumber(ref value, true); /// public void Read(ref ushort? value) => value = ReadNullableUInt16(); @@ -613,37 +606,37 @@ public void Read(in StringBuilder values) public void Read(ref char? value) => value = ReadNullableChar(); /// - public void Read(ref int value) => value = ReadInt32(); + public void Read(ref int value) => ReadNumber(ref value, false); /// public void Read(ref int? value) => value = ReadNullableInt32(); /// - public void Read(ref uint value) => value = ReadUInt32(); + public void Read(ref uint value) => ReadNumber(ref value, true); /// public void Read(ref uint? value) => value = ReadNullableUInt32(); /// - public void Read(ref long value) => value = ReadInt64(); + public void Read(ref long value) => ReadNumber(ref value, false); /// public void Read(ref long? value) => value = ReadNullableInt64(); /// - public void Read(ref ulong value) => value = ReadUInt64(); + public void Read(ref ulong value) => ReadNumber(ref value, true); /// public void Read(ref ulong? value) => value = ReadNullableUInt64(); /// - public void Read(ref Int128 value) => value = ReadInt128(); + public void Read(ref Int128 value) => ReadNumber(ref value, false); /// public void Read(ref Int128? value) => value = ReadNullableInt128(); /// - public void Read(ref UInt128 value) => value = ReadUInt128(); + public void Read(ref UInt128 value) => ReadNumber(ref value, true); /// public void Read(ref UInt128? value) => value = ReadNullableUInt128(); diff --git a/src/Backdash/Serialization/Internal/EndiannessSerializer.cs b/src/Backdash/Serialization/Internal/EndiannessSerializer.cs index bceff106..5b29c246 100644 --- a/src/Backdash/Serialization/Internal/EndiannessSerializer.cs +++ b/src/Backdash/Serialization/Internal/EndiannessSerializer.cs @@ -36,6 +36,14 @@ public T Read(ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) return T.ReadBigEndian(buffer[..bytesRead], isUnsigned); } + public void Read(ref T value, ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) + where T : unmanaged, IBinaryInteger + { + bytesRead = Unsafe.SizeOf(); + if (!T.TryReadBigEndian(buffer[..bytesRead], isUnsigned, out value)) + throw new OverflowException(); + } + public bool Write(Span buffer, T value, out int size) where T : unmanaged, IBinaryInteger { @@ -67,6 +75,14 @@ public T Read(ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) return T.ReadLittleEndian(buffer[..bytesRead], isUnsigned); } + public void Read(ref T value, ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) + where T : unmanaged, IBinaryInteger + { + bytesRead = Unsafe.SizeOf(); + if (!T.TryReadLittleEndian(buffer[..bytesRead], isUnsigned, out value)) + throw new OverflowException(); + } + public bool Write(Span buffer, T value, out int size) where T : unmanaged, IBinaryInteger { @@ -112,6 +128,10 @@ int Write(ArrayBufferWriter buffer, T value) where T : unmanaged, IBina /// Reads number from the buffer T Read(ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) where T : unmanaged, IBinaryInteger; + /// Reads number from the buffer + void Read(ref T value, ReadOnlySpan buffer, bool isUnsigned, out int bytesRead) + where T : unmanaged, IBinaryInteger; + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] T Read(in ReadOnlySpan buffer, out int bytesRead) From 04bc5ff1aef25c9d025b223ea5f6418f8a022083 Mon Sep 17 00:00:00 2001 From: Lucas Teles Date: Thu, 28 May 2026 18:54:01 -0300 Subject: [PATCH 6/6] WIP --- src/Backdash/Network/Endianness.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Backdash/Network/Endianness.cs b/src/Backdash/Network/Endianness.cs index d046a643..41635560 100644 --- a/src/Backdash/Network/Endianness.cs +++ b/src/Backdash/Network/Endianness.cs @@ -1,7 +1,7 @@ namespace Backdash.Network; /// -/// Defines a endianness value +/// Defines an endianness value /// public enum Endianness : byte {