Skip to content

Commit 43f04e1

Browse files
committed
Added non alloc calls to BitWriter and Reader
1 parent 3f70876 commit 43f04e1

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

MLAPI/NetworkingManagerComponents/Binary/BitReader.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,25 @@ public byte ReadByte()
7171
public int ReadInt() => (int)ZigZagDecode(ReadUInt(), 4);
7272
public long ReadLong() => ZigZagDecode(ReadULong(), 8);
7373
public float[] ReadFloatArray(int known = -1) => ReadArray(ReadFloat, known);
74+
public uint ReadFloatArray(float[] buffer, int known = -1) => ReadArray(ReadFloat, buffer, known);
7475
public double[] ReadDoubleArray(int known = -1) => ReadArray(ReadDouble, known);
76+
public uint ReadDoubleArray(double[] buffer, int known = -1) => ReadArray(ReadDouble, buffer, known);
7577
public byte[] ReadByteArray(int known = -1) => ReadArray(ReadByte, known);
78+
public uint ReadByteArray(byte[] buffer, int known = -1) => ReadArray(ReadByte, buffer, known);
7679
public ushort[] ReadUShortArray(int known = -1) => ReadArray(ReadUShort, known);
80+
public uint ReadUShortArray(ushort[] buffer, int known = -1) => ReadArray(ReadUShort, buffer, known);
7781
public uint[] ReadUIntArray(int known = -1) => ReadArray(ReadUInt, known);
82+
public uint ReadUIntArray(uint[] buffer, int known = -1) => ReadArray(ReadUInt, buffer, known);
7883
public ulong[] ReadULongArray(int known = -1) => ReadArray(ReadULong, known);
84+
public uint ReadULongArray(ulong[] buffer, int known = -1) => ReadArray(ReadULong, buffer, known);
7985
public sbyte[] ReadSByteArray(int known = -1) => ReadArray(ReadSByte, known);
86+
public uint ReadSByteArray(sbyte[] buffer, int known = -1) => ReadArray(ReadSByte, buffer, known);
8087
public short[] ReadShortArray(int known = -1) => ReadArray(ReadShort, known);
88+
public uint ReadShortArray(short[] buffer, int known = -1) => ReadArray(ReadShort, buffer, known);
8189
public int[] ReadIntArray(int known = -1) => ReadArray(ReadInt, known);
90+
public uint ReadIntArray(int[] buffer, int known = -1) => ReadArray(ReadInt, buffer, known);
8291
public long[] ReadLongArray(int known = -1) => ReadArray(ReadLong, known);
92+
public uint ReadLongArray(long[] buffer, int known = -1) => ReadArray(ReadLong, buffer, known);
8393
public string ReadString() => Encoding.UTF8.GetString(ReadByteArray());
8494
public byte ReadBits(int bits)
8595
{
@@ -115,6 +125,7 @@ public ulong ReadULong()
115125
}
116126
return res;
117127
}
128+
118129
private T[] ReadArray<T>(Getter<T> g, int knownSize = -1)
119130
{
120131
T[] result = new T[knownSize > 0 ? (uint)knownSize : ReadUInt()];
@@ -123,6 +134,22 @@ private T[] ReadArray<T>(Getter<T> g, int knownSize = -1)
123134
return result;
124135
}
125136

137+
private uint ReadArray<T>(Getter<T> g, T[] buffer, int knownSize = -1)
138+
{
139+
uint size = knownSize > 0 ? (uint)knownSize : ReadUInt();
140+
/*
141+
if (buffer.Length < size)
142+
throw new ArgumentException("Buffer size is too small");
143+
*/
144+
for (ushort s = 0; s < size; ++s)
145+
{
146+
if (s > buffer.Length)
147+
break; //The buffer is too small. We still give the correct size so it can be re-read
148+
buffer[s] = g();
149+
}
150+
return size;
151+
}
152+
126153
private T ReadFloating<T>()
127154
{
128155
int size = Marshal.SizeOf(typeof(T));

MLAPI/NetworkingManagerComponents/Binary/BitWriter.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,26 @@ private void Push<T>(T b)
116116
public void WriteLong(long l) => Push(ZigZagEncode(l, 8));
117117
public void WriteString(string s) => Push(s);
118118
public void WriteAlignBits() => Push<object>(null);
119-
public void WriteFloatArray(float[] f, bool known = false) => PushArray(f, known);
120-
public void WriteDoubleArray(double[] d, bool known = false) => PushArray(d, known);
121-
public void WriteByteArray(byte[] b, bool known = false) => PushArray(b, known);
122-
public void WriteUShortArray(ushort[] s, bool known = false) => PushArray(s, known);
123-
public void WriteUIntArray(uint[] i, bool known = false) => PushArray(i, known);
124-
public void WriteULongArray(ulong[] l, bool known = false) => PushArray(l, known);
125-
public void WriteSByteArray(sbyte[] b, bool known = false) => PushArray(b, known);
126-
public void WriteShortArray(short[] s, bool known = false) => PushArray(s, known);
127-
public void WriteIntArray(int[] i, bool known = false) => PushArray(i, known);
128-
public void WriteLongArray(long[] l, bool known = false) => PushArray(l, known);
119+
public void WriteFloatArray(float[] f, bool known = false) => PushArray(f, known);
120+
public void WriteFloatArray(float[] f, int startIndex, int length, bool known = false) => PushArray(f, startIndex, length, known);
121+
public void WriteDoubleArray(double[] d, bool known = false) => PushArray(d, known);
122+
public void WriteDoubleArray(double[] d, int startIndex, int length, bool known = false) => PushArray(d, startIndex, length, known);
123+
public void WriteByteArray(byte[] b, bool known = false) => PushArray(b, known);
124+
public void WriteByteArray(byte[] b, int startIndex, int length, bool known = false) => PushArray(b, startIndex, length, known);
125+
public void WriteUShortArray(ushort[] s, bool known = false) => PushArray(s, known);
126+
public void WriteUShortArray(ushort[] s, int startIndex, int length, bool known = false) => PushArray(s, startIndex, length, known);
127+
public void WriteUIntArray(uint[] i, bool known = false) => PushArray(i, known);
128+
public void WriteUIntArray(uint[] i, int startIndex, int length, bool known = false) => PushArray(i, startIndex, length, known);
129+
public void WriteULongArray(ulong[] l, bool known = false) => PushArray(l, known);
130+
public void WriteULongArray(ulong[] l, int startIndex, int length, bool known = false) => PushArray(l, startIndex, length, known);
131+
public void WriteSByteArray(sbyte[] b, bool known = false) => PushArray(b, known);
132+
public void WriteSByteArray(sbyte[] b, int startIndex, int length, bool known = false) => PushArray(b, startIndex, length, known);
133+
public void WriteShortArray(short[] s, bool known = false) => PushArray(s, known);
134+
public void WriteShortArray(short[] s, int startIndex, int length, bool known = false) => PushArray(s, startIndex, length, known);
135+
public void WriteIntArray(int[] i, bool known = false) => PushArray(i, known);
136+
public void WriteIntArray(int[] i, int startIndex, int length, bool known = false) => PushArray(i, startIndex, length, known);
137+
public void WriteLongArray(long[] l, bool known = false) => PushArray(l, known);
138+
public void WriteLongArray(long[] l, int startIndex, int length, bool known = false) => PushArray(l, startIndex, length, known);
129139
public void WriteBits(byte value, int bits) => Push(new Partial(ReadNBits(value, 0, bits % 8), (byte)(bits%8))); // Suggestion: store (bits % 8) result?
130140
public void WriteWriter(BitWriter writer)
131141
{
@@ -143,6 +153,14 @@ private void PushArray<T>(T[] t, bool knownSize = false)
143153
foreach (T t1 in t) Push(signed ? (object)ZigZagEncode(t1 as long? ?? t1 as int? ?? t1 as short? ?? t1 as sbyte? ?? 0, size) : (object)t1);
144154
}
145155

156+
private void PushArray<T>(T[] t, int startIndex, int length, bool knownSize = false)
157+
{
158+
if (!knownSize) Push((uint)t.Length);
159+
bool signed = IsSigned(t.GetType().GetElementType());
160+
int size = Marshal.SizeOf(t.GetType().GetElementType());
161+
for (int i = startIndex; i < length; i++) Push(signed ? (object)ZigZagEncode(t[i] as long? ?? t[i] as int? ?? t[i] as short? ?? t[i] as sbyte? ?? 0, size) : (object)t[i]);
162+
}
163+
146164
/// <summary>
147165
/// Serializes data, allocates an array and returns it
148166
/// </summary>

0 commit comments

Comments
 (0)