@@ -249,9 +249,8 @@ private string GenerateProtobufClasses(string protoFileContent)
249
249
250
250
if ( ! oneof . Inline )
251
251
{
252
- codeGenerator . OpenBlock ( $ "public ref T Alloc{ oneofName } <T>(ref ArenaAllocator memory) where T : unmanaged") ;
253
- codeGenerator . AppendLine ( $ "var mem = memory.TakeContiguousSpan(sizeof(T));") ;
254
- codeGenerator . AppendLine ( $ "{ oneofName } Data = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(mem));") ;
252
+ codeGenerator . OpenBlock ( $ "public ref T Alloc{ oneofName } <T, TAllocator>(ref TAllocator memory) where T : unmanaged where TAllocator : unmanaged, IAllocator") ;
253
+ codeGenerator . AppendLine ( $ "{ oneofName } Data = (byte*)memory.Allocate<T>();") ;
255
254
codeGenerator . AppendLine ( $ "return ref Unsafe.AsRef<T>({ oneofName } Data);") ;
256
255
codeGenerator . CloseBlock ( ) ;
257
256
}
@@ -260,7 +259,7 @@ private string GenerateProtobufClasses(string protoFileContent)
260
259
codeGenerator . AppendLine ( $ "public ref { field . Type . ToCSharpType ( false , false ) } { field . Name } => ref { oneofName } <{ field . Type . ToCSharpType ( false , false ) } >();") ;
261
260
}
262
261
263
- codeGenerator . OpenBlock ( "internal unsafe void Read(ref ProtoReader reader, ref ArenaAllocator memory)" ) ;
262
+ codeGenerator . OpenBlock ( "internal unsafe void Read<TAllocator> (ref ProtoReader reader, ref TAllocator memory) where TAllocator : unmanaged, IAllocator " ) ;
264
263
265
264
foreach ( var field in message . Fields . Where ( f => f . IsRepeated ) )
266
265
{
@@ -329,8 +328,9 @@ private string GenerateProtobufClasses(string protoFileContent)
329
328
330
329
foreach ( var field in message . Fields . Where ( f => f . IsRepeated ) )
331
330
{
331
+ var genericType = field . Type . ToCSharpType ( false , false ) ;
332
332
codeGenerator . AppendLine (
333
- $ "{ field . Name } = UnmanagedArray<{ field . Type . ToCSharpType ( false , false ) } >.AllocArray({ field . Name } _count, ref memory);") ;
333
+ $ "{ field . Name } = UnmanagedArray<{ genericType } >.AllocArray<TAllocator> ({ field . Name } _count, ref memory);") ;
334
334
codeGenerator . AppendLine ( $ "{ field . Name } _count = 0;") ;
335
335
}
336
336
@@ -339,7 +339,7 @@ private string GenerateProtobufClasses(string protoFileContent)
339
339
var keyType = map . KeyType . ToCSharpType ( false , false ) ;
340
340
var valueType = map . ValueType . ToCSharpType ( false , false ) ;
341
341
codeGenerator . AppendLine (
342
- $ "{ map . Name } = UnmanagedMap<{ keyType } , { valueType } >.AllocMap({ map . Name } _count, ref memory);") ;
342
+ $ "{ map . Name } = UnmanagedMap<{ keyType } , { valueType } >.AllocMap<TAllocator> ({ map . Name } _count, ref memory);") ;
343
343
codeGenerator . AppendLine ( $ "{ map . Name } _count = 0;") ;
344
344
codeGenerator . AppendLine (
345
345
$ "{ map . Name } .GetUnderlyingArrays(out var { map . Name } _keys, out var { map . Name } _values);") ;
@@ -368,8 +368,8 @@ string ReadType(ProtoType type, string reader)
368
368
BuiltinTypes . Sfixed32 => $ "(int){ reader } .ReadFixed32()",
369
369
BuiltinTypes . Sfixed64 => $ "(long){ reader } .ReadFixed64()",
370
370
BuiltinTypes . Bool => $ "{ reader } .ReadBool()",
371
- BuiltinTypes . String => $ "{ reader } .ReadUtf8String(ref memory)",
372
- BuiltinTypes . Bytes => $ "{ reader } .ReadBytesArray(ref memory)",
371
+ BuiltinTypes . String => $ "{ reader } .ReadUtf8String<TAllocator> (ref memory)",
372
+ BuiltinTypes . Bytes => $ "{ reader } .ReadBytesArray<TAllocator> (ref memory)",
373
373
_ => throw new NotImplementedException ( $ "Type { type } is not supported")
374
374
} ;
375
375
}
@@ -384,7 +384,7 @@ string ReadType(ProtoType type, string reader)
384
384
codeGenerator . AppendLine ( "var subReader = reader.ReadMessage();" ) ;
385
385
codeGenerator . AppendLine ( $ "{ field . Name } [{ field . Name } _count] = default;") ;
386
386
codeGenerator . AppendLine (
387
- $ "{ field . Name } [{ field . Name } _count++].Read(ref subReader, ref memory);") ;
387
+ $ "{ field . Name } [{ field . Name } _count++].Read<TAllocator> (ref subReader, ref memory);") ;
388
388
}
389
389
else
390
390
{
@@ -416,23 +416,21 @@ string ReadType(ProtoType type, string reader)
416
416
if ( field . IsOptionalPointer )
417
417
{
418
418
var fieldType = field . Type . ToCSharpType ( false , false ) ;
419
- codeGenerator . AppendLine (
420
- $ "var { field . Name } _span = memory.TakeContiguousSpan(sizeof({ fieldType } ));") ;
421
- codeGenerator . AppendLine ( $ "{ field . Name } = ({ fieldType } *)Unsafe.AsPointer(ref MemoryMarshal.GetReference({ field . Name } _span));") ;
419
+ codeGenerator . AppendLine ( $ "{ field . Name } = memory.Allocate<{ fieldType } >();") ;
422
420
codeGenerator . AppendLine ( $ "*{ field . Name } = default;") ;
423
- codeGenerator . AppendLine ( $ "{ field . Name } ->Read(ref subReader, ref memory);") ;
421
+ codeGenerator . AppendLine ( $ "{ field . Name } ->Read<TAllocator> (ref subReader, ref memory);") ;
424
422
}
425
423
else
426
424
{
427
425
codeGenerator . AppendLine ( $ "{ field . Name } .Value = default;") ;
428
- codeGenerator . AppendLine ( $ "{ field . Name } .Value.Read(ref subReader, ref memory);") ;
426
+ codeGenerator . AppendLine ( $ "{ field . Name } .Value.Read<TAllocator> (ref subReader, ref memory);") ;
429
427
codeGenerator . AppendLine ( $ "{ field . Name } .HasValue = true;") ;
430
428
}
431
429
}
432
430
else
433
431
{
434
432
codeGenerator . AppendLine ( $ "{ field . Name } = default;") ;
435
- codeGenerator . AppendLine ( $ "{ field . Name } .Read(ref subReader, ref memory);") ;
433
+ codeGenerator . AppendLine ( $ "{ field . Name } .Read<TAllocator> (ref subReader, ref memory);") ;
436
434
}
437
435
}
438
436
else
@@ -459,7 +457,7 @@ string ReadType(ProtoType type, string reader)
459
457
codeGenerator . AppendLine ( "var subSubReader = subReader.ReadMessage();" ) ;
460
458
codeGenerator . AppendLine ( $ "{ map . Name } _values[{ map . Name } _count] = default;") ;
461
459
codeGenerator . AppendLine (
462
- $ "{ map . Name } _values[{ map . Name } _count].Read(ref subSubReader, ref memory);") ;
460
+ $ "{ map . Name } _values[{ map . Name } _count].Read<TAllocator> (ref subSubReader, ref memory);") ;
463
461
}
464
462
else
465
463
{
@@ -491,7 +489,7 @@ string ReadType(ProtoType type, string reader)
491
489
{
492
490
codeGenerator . AppendLine ( $ "{ oneof . Name } Data.{ field . Name } = default;") ;
493
491
codeGenerator . AppendLine ( $ "var subReader = reader.ReadMessage();") ;
494
- codeGenerator . AppendLine ( $ "{ oneof . Name } Data.{ field . Name } .Read(ref subReader, ref memory);") ;
492
+ codeGenerator . AppendLine ( $ "{ oneof . Name } Data.{ field . Name } .Read<TAllocator> (ref subReader, ref memory);") ;
495
493
}
496
494
else
497
495
{
@@ -500,14 +498,14 @@ string ReadType(ProtoType type, string reader)
500
498
}
501
499
else
502
500
{
503
- codeGenerator . AppendLine ( $ " var mem = memory.TakeContiguousSpan(sizeof( { field . Type . ToCSharpType ( false , false ) } ));" ) ;
504
- codeGenerator . AppendLine ( $ "{ oneof . Name } Data = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(mem) );") ;
505
- codeGenerator . AppendLine ( $ "{ field . Type . ToCSharpType ( false , false ) } * ptr = ({ field . Type . ToCSharpType ( false , false ) } *) { oneof . Name } Data ;") ;
501
+ var fieldType = field . Type . ToCSharpType ( false , false ) ;
502
+ codeGenerator . AppendLine ( $ "{ field . Type . ToCSharpType ( false , false ) } * ptr = memory.Allocate< { fieldType } >( );") ;
503
+ codeGenerator . AppendLine ( $ "{ oneof . Name } Data = (byte*)ptr ;") ;
506
504
if ( field . Type . IsMessage )
507
505
{
508
506
codeGenerator . AppendLine ( "var subReader = reader.ReadMessage();" ) ;
509
507
codeGenerator . AppendLine ( "*ptr = default;" ) ;
510
- codeGenerator . AppendLine ( "ptr->Read(ref subReader, ref memory);" ) ;
508
+ codeGenerator . AppendLine ( "ptr->Read<TAllocator> (ref subReader, ref memory);" ) ;
511
509
}
512
510
else
513
511
{
0 commit comments