Skip to content

Commit 2c4dfd2

Browse files
Finish normal Codecs and write README
1 parent d66dcbd commit 2c4dfd2

16 files changed

Lines changed: 1682 additions & 149 deletions

Codon.BinaryCodec/BinaryCodec.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using System;
2+
using Codon.Buffer;
3+
4+
#pragma warning disable CS8714 // The type cannot be used as type parameter in the generic type or method. Nullability of type argument doesn't match 'notnull' constraint.
5+
6+
namespace Codon.Binary
7+
{
8+
public static class BinaryCodec
9+
{
10+
public static readonly BinaryCodecs.BooleanBinaryCodec Boolean = new();
11+
12+
public static readonly BinaryCodecs.ByteBinaryCodec Byte = new();
13+
14+
public static readonly BinaryCodecs.IntBinaryCodec Int = new();
15+
16+
public static readonly BinaryCodecs.LongBinaryCodec Long = new();
17+
18+
public static readonly BinaryCodecs.DoubleBinaryCodec Double = new();
19+
20+
public static readonly BinaryCodecs.FloatBinaryCodec Float = new();
21+
22+
public static readonly BinaryCodecs.VarIntBinaryCodec VarInt = new();
23+
24+
public static readonly BinaryCodecs.ByteArrayBinaryCodec ByteArray = new();
25+
26+
public static readonly BinaryCodecs.BinaryBufferBinaryCodec BinaryBuffer = new();
27+
28+
public static readonly BinaryCodecs.RawBytesBinaryCodec RawBytes = new();
29+
30+
public static readonly BinaryCodecs.StringBinaryCodec String = new();
31+
32+
public static BinaryCodecs.RecursiveBinaryCodec<T> Recursive<T>(Func<BinaryCodec<T>, BinaryCodec<T>> self) where T : notnull
33+
{
34+
return new BinaryCodecs.RecursiveBinaryCodec<T>(self);
35+
}
36+
37+
public static BinaryCodecs.EnumBinaryCodec<E> Enum<E>() where E : Enum
38+
{
39+
return new BinaryCodecs.EnumBinaryCodec<E>();
40+
}
41+
}
42+
43+
public interface BinaryCodec<T>
44+
{
45+
public void Write(BinaryBuffer buffer, T value);
46+
public T Read(BinaryBuffer buffer);
47+
48+
public BinaryCodecs.OptionalBinaryCodec<T> Optional()
49+
{
50+
return new BinaryCodecs.OptionalBinaryCodec<T>(this);
51+
}
52+
53+
public BinaryCodecs.DefaultBinaryCodec<T> Default(T defaultValue)
54+
{
55+
return new BinaryCodecs.DefaultBinaryCodec<T>(this, defaultValue);
56+
}
57+
58+
public BinaryCodecs.TransformativeBinaryCodec<T, S> Transform<S>(Func<S, T> from, Func<T, S> to)
59+
{
60+
return new BinaryCodecs.TransformativeBinaryCodec<T, S>(this, from, to);
61+
}
62+
63+
public BinaryCodecs.DictionaryBinaryCodec<T, V> MapTo<V>(BinaryCodec<V> valueCodec) where V : notnull
64+
{
65+
return new BinaryCodecs.DictionaryBinaryCodec<T, V>(this, valueCodec);
66+
}
67+
68+
public BinaryCodecs.ListBinaryCodec<T> List()
69+
{
70+
return new BinaryCodecs.ListBinaryCodec<T>(this);
71+
}
72+
73+
public BinaryCodecs.UnionBinaryCodec<K, T> Union<K>(Func<T, BinaryCodec<K>> serializerFactory, Func<K, T> keyFunc) where K : notnull
74+
{
75+
return new BinaryCodecs.UnionBinaryCodec<K, T>(this, keyFunc, serializerFactory);
76+
}
77+
}
78+
}

Codon.BinaryCodec/BinaryCodecs.cs

Lines changed: 37 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,8 @@ namespace Codon.Binary;
1111

1212
public static class BinaryCodecs
1313
{
14-
public static readonly BooleanBinaryCodec Boolean = new();
1514

16-
public static readonly ByteBinaryCodec Byte = new();
17-
18-
public static readonly IntBinaryCodec Int = new();
19-
20-
public static readonly LongBinaryCodec Long = new();
21-
22-
public static readonly DoubleBinaryCodec Double = new();
23-
24-
public static readonly FloatBinaryCodec Float = new();
25-
26-
public static readonly VarIntBinaryCodec VarInt = new();
27-
28-
public static readonly ByteArrayBinaryCodec ByteArray = new();
29-
30-
public static readonly BinaryBufferBinaryCodec BinaryBuffer = new();
31-
32-
public static readonly RawBytesBinaryCodec RawBytes = new();
33-
34-
public static readonly StringBinaryCodec String = new();
35-
36-
public static RecursiveBinaryCodec<T> Recursive<T>(Func<IBinaryCodec<T>, IBinaryCodec<T>> self) where T : notnull
37-
{
38-
return new RecursiveBinaryCodec<T>(self);
39-
}
40-
41-
public static EnumBinaryCodec<E> Enum<E>() where E : Enum
42-
{
43-
return new EnumBinaryCodec<E>();
44-
}
45-
46-
public class BooleanBinaryCodec : IBinaryCodec<bool>
15+
public class BooleanBinaryCodec : BinaryCodec<bool>
4716
{
4817
public void Write(BinaryBuffer buffer, bool value)
4918
{
@@ -56,7 +25,7 @@ public bool Read(BinaryBuffer buffer)
5625
}
5726
}
5827

59-
public class ByteBinaryCodec : IBinaryCodec<byte>
28+
public class ByteBinaryCodec : BinaryCodec<byte>
6029
{
6130
public void Write(BinaryBuffer buffer, byte value)
6231
{
@@ -69,7 +38,7 @@ public byte Read(BinaryBuffer buffer)
6938
}
7039
}
7140

72-
public class IntBinaryCodec : IBinaryCodec<int>
41+
public class IntBinaryCodec : BinaryCodec<int>
7342
{
7443
public void Write(BinaryBuffer buffer, int value)
7544
{
@@ -82,7 +51,7 @@ public int Read(BinaryBuffer buffer)
8251
}
8352
}
8453

85-
public class LongBinaryCodec : IBinaryCodec<long>
54+
public class LongBinaryCodec : BinaryCodec<long>
8655
{
8756
public void Write(BinaryBuffer buffer, long value)
8857
{
@@ -95,7 +64,7 @@ public long Read(BinaryBuffer buffer)
9564
}
9665
}
9766

98-
public class FloatBinaryCodec : IBinaryCodec<float>
67+
public class FloatBinaryCodec : BinaryCodec<float>
9968
{
10069
public void Write(BinaryBuffer buffer, float value)
10170
{
@@ -108,7 +77,7 @@ public float Read(BinaryBuffer buffer)
10877
}
10978
}
11079

111-
public class DoubleBinaryCodec : IBinaryCodec<double>
80+
public class DoubleBinaryCodec : BinaryCodec<double>
11281
{
11382
public void Write(BinaryBuffer buffer, double value)
11483
{
@@ -121,7 +90,7 @@ public double Read(BinaryBuffer buffer)
12190
}
12291
}
12392

124-
public class VarIntBinaryCodec : IBinaryCodec<int>
93+
public class VarIntBinaryCodec : BinaryCodec<int>
12594
{
12695
private const int SEGMENT_BITS = 0x7F;
12796
private const int CONTINUE_BIT = 0x80;
@@ -165,56 +134,56 @@ public int Read(BinaryBuffer buffer)
165134
}
166135
}
167136

168-
public class ByteArrayBinaryCodec : IBinaryCodec<byte[]>
137+
public class ByteArrayBinaryCodec : BinaryCodec<byte[]>
169138
{
170139
public void Write(BinaryBuffer buffer, byte[] value)
171140
{
172-
VarInt.Write(buffer, value.Length);
141+
BinaryCodec.VarInt.Write(buffer, value.Length);
173142
buffer.WriteBytes(value);
174143
}
175144

176145
public byte[] Read(BinaryBuffer buffer)
177146
{
178-
var size = VarInt.Read(buffer);
147+
var size = BinaryCodec.VarInt.Read(buffer);
179148
return buffer.ReadBytes(size).ToArray();
180149
}
181150
}
182151

183-
public class BinaryBufferBinaryCodec : IBinaryCodec<BinaryBuffer>
152+
public class BinaryBufferBinaryCodec : BinaryCodec<BinaryBuffer>
184153
{
185154
public void Write(BinaryBuffer buffer, BinaryBuffer value)
186155
{
187156
var array = value.ToArray();
188-
VarInt.Write(buffer, array.Length);
157+
BinaryCodec.VarInt.Write(buffer, array.Length);
189158
buffer.WriteBytes(array);
190159
}
191160

192161
public BinaryBuffer Read(BinaryBuffer buffer)
193162
{
194-
var size = VarInt.Read(buffer);
163+
var size = BinaryCodec.VarInt.Read(buffer);
195164
return buffer.ReadBytes(size).ToArray().ToBinaryBuffer();
196165
}
197166
}
198167

199-
public class StringBinaryCodec : IBinaryCodec<string>
168+
public class StringBinaryCodec : BinaryCodec<string>
200169
{
201170
public void Write(BinaryBuffer buffer, string value)
202171
{
203172
var stringBytes = Encoding.UTF8.GetBytes(value);
204-
VarInt.Write(buffer, stringBytes.Length);
173+
BinaryCodec.VarInt.Write(buffer, stringBytes.Length);
205174
buffer.WriteBytes(stringBytes);
206175
}
207176

208177
public string Read(BinaryBuffer buffer)
209178
{
210-
var size = VarInt.Read(buffer);
179+
var size = BinaryCodec.VarInt.Read(buffer);
211180
if (size < 0) throw new InvalidDataException("String cannot have negative length");
212181
var stringBytes = buffer.ReadBytes(size);
213182
return Encoding.UTF8.GetString(stringBytes);
214183
}
215184
}
216185

217-
public class RawBytesBinaryCodec : IBinaryCodec<byte[]>
186+
public class RawBytesBinaryCodec : BinaryCodec<byte[]>
218187
{
219188
public void Write(BinaryBuffer buffer, byte[] value)
220189
{
@@ -227,21 +196,21 @@ public byte[] Read(BinaryBuffer buffer)
227196
}
228197
}
229198

230-
public class OptionalBinaryCodec<T>(IBinaryCodec<T> innerCodec) : IBinaryCodec<T?> where T : notnull
199+
public class OptionalBinaryCodec<T>(BinaryCodec<T> innerCodec) : BinaryCodec<T?> where T : notnull
231200
{
232201
public void Write(BinaryBuffer buffer, T? value)
233202
{
234-
Boolean.Write(buffer, value != null);
203+
BinaryCodec.Boolean.Write(buffer, value != null);
235204
if (value != null) innerCodec.Write(buffer, value);
236205
}
237206

238207
public T? Read(BinaryBuffer buffer)
239208
{
240-
return Boolean.Read(buffer) ? innerCodec.Read(buffer) : default;
209+
return BinaryCodec.Boolean.Read(buffer) ? innerCodec.Read(buffer) : default;
241210
}
242211
}
243212

244-
public class DefaultBinaryCodec<T>(IBinaryCodec<T> innerCodec, T defaultValue) : IBinaryCodec<T> where T : notnull
213+
public class DefaultBinaryCodec<T>(BinaryCodec<T> innerCodec, T defaultValue) : BinaryCodec<T> where T : notnull
245214
{
246215
public void Write(BinaryBuffer buffer, T? value)
247216
{
@@ -250,11 +219,11 @@ public void Write(BinaryBuffer buffer, T? value)
250219

251220
public T Read(BinaryBuffer buffer)
252221
{
253-
return Boolean.Read(buffer) ? innerCodec.Read(buffer) : defaultValue;
222+
return BinaryCodec.Boolean.Read(buffer) ? innerCodec.Read(buffer) : defaultValue;
254223
}
255224
}
256225

257-
public class TransformativeBinaryCodec<T, S>(IBinaryCodec<T> innerCodec, Func<S, T> from, Func<T, S> to) : IBinaryCodec<S> where S : notnull where T : notnull
226+
public class TransformativeBinaryCodec<T, S>(BinaryCodec<T> innerCodec, Func<S, T> from, Func<T, S> to) : BinaryCodec<S> where S : notnull where T : notnull
258227
{
259228
public void Write(BinaryBuffer buffer, S value)
260229
{
@@ -268,11 +237,11 @@ public S Read(BinaryBuffer buffer)
268237
}
269238
}
270239

271-
public class DictionaryBinaryCodec<K, V>(IBinaryCodec<K> keyCodec, IBinaryCodec<V> valueCodec) : IBinaryCodec<Dictionary<K, V>> where K : notnull where V : notnull
240+
public class DictionaryBinaryCodec<K, V>(BinaryCodec<K> keyCodec, BinaryCodec<V> valueCodec) : BinaryCodec<Dictionary<K, V>> where K : notnull where V : notnull
272241
{
273242
public void Write(BinaryBuffer buffer, Dictionary<K, V> value)
274243
{
275-
VarInt.Write(buffer, value.Count);
244+
BinaryCodec.VarInt.Write(buffer, value.Count);
276245
foreach (var keyValuePair in value)
277246
{
278247
keyCodec.Write(buffer, keyValuePair.Key);
@@ -283,7 +252,7 @@ public void Write(BinaryBuffer buffer, Dictionary<K, V> value)
283252
public Dictionary<K, V> Read(BinaryBuffer buffer)
284253
{
285254
var dict = new Dictionary<K, V>();
286-
var size = VarInt.Read(buffer); // how big is my dict...
255+
var size = BinaryCodec.VarInt.Read(buffer); // how big is my dict...
287256

288257
for (var i = 0; i < size; i++)
289258
{
@@ -296,26 +265,26 @@ public Dictionary<K, V> Read(BinaryBuffer buffer)
296265
}
297266
}
298267

299-
public class ListBinaryCodec<T>(IBinaryCodec<T> innerCodec) : IBinaryCodec<List<T>> where T : notnull
268+
public class ListBinaryCodec<T>(BinaryCodec<T> innerCodec) : BinaryCodec<List<T>> where T : notnull
300269
{
301270
public void Write(BinaryBuffer buffer, List<T> value)
302271
{
303-
VarInt.Write(buffer, value.Count);
272+
BinaryCodec.VarInt.Write(buffer, value.Count);
304273
value.ForEach(item => innerCodec.Write(buffer, item));
305274
}
306275

307276
public List<T> Read(BinaryBuffer buffer)
308277
{
309278
var list = new List<T>();
310-
var size = VarInt.Read(buffer);
279+
var size = BinaryCodec.VarInt.Read(buffer);
311280

312281
for (var i = 0; i < size; i++) list.Add(innerCodec.Read(buffer));
313282

314283
return list;
315284
}
316285
}
317286

318-
public class UnionBinaryCodec<T, K>(IBinaryCodec<K> keyCodec, Func<T, K> keyFunc, Func<K, IBinaryCodec<T>> serializerFactory) : IBinaryCodec<T>
287+
public class UnionBinaryCodec<T, K>(BinaryCodec<K> keyCodec, Func<T, K> keyFunc, Func<K, BinaryCodec<T>> serializerFactory) : BinaryCodec<T>
319288
{
320289
public void Write(BinaryBuffer buffer, T value)
321290
{
@@ -334,13 +303,13 @@ public T Read(BinaryBuffer buffer)
334303
}
335304
}
336305

337-
public class RecursiveBinaryCodec<T> : IBinaryCodec<T> where T : notnull
306+
public class RecursiveBinaryCodec<T> : BinaryCodec<T> where T : notnull
338307
{
339-
private readonly Lazy<IBinaryCodec<T>> _delegate;
308+
private readonly Lazy<BinaryCodec<T>> _delegate;
340309

341-
public RecursiveBinaryCodec(Func<IBinaryCodec<T>, IBinaryCodec<T>> self)
310+
public RecursiveBinaryCodec(Func<BinaryCodec<T>, BinaryCodec<T>> self)
342311
{
343-
_delegate = new Lazy<IBinaryCodec<T>>(() => self.Invoke(this));
312+
_delegate = new Lazy<BinaryCodec<T>>(() => self.Invoke(this));
344313
}
345314

346315
public void Write(BinaryBuffer buffer, T value)
@@ -354,19 +323,19 @@ public T Read(BinaryBuffer buffer)
354323
}
355324
}
356325

357-
public class EnumBinaryCodec<E> : IBinaryCodec<E> where E : Enum
326+
public class EnumBinaryCodec<E> : BinaryCodec<E> where E : Enum
358327
{
359328
private Array _entries = System.Enum.GetValues(typeof(E));
360329

361330
public void Write(BinaryBuffer buffer, E value)
362331
{
363332
var ordinal = Array.IndexOf(_entries, value);
364-
VarInt.Write(buffer, ordinal);
333+
BinaryCodec.VarInt.Write(buffer, ordinal);
365334
}
366335

367336
public E Read(BinaryBuffer buffer)
368337
{
369-
var ordinal = VarInt.Read(buffer);
338+
var ordinal = BinaryCodec.VarInt.Read(buffer);
370339
if (ordinal < 0 || ordinal >= _entries.Length) throw new IndexOutOfRangeException($"Ordinal {ordinal} is outside the range [0, {_entries.Length - 1}] for enum {typeof(E).Name}");
371340

372341
return (E)_entries.GetValue(ordinal)!;

0 commit comments

Comments
 (0)