@@ -172,18 +172,21 @@ public bool TryReadCollectionHeader(out int length)
172
172
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
173
173
public string ? ReadString ( )
174
174
{
175
- if ( ! TryReadUnmanagedSpan < char > ( out var view , out var advanceLength ) )
175
+ if ( ! TryReadCollectionHeader ( out var length ) )
176
176
{
177
177
return null ;
178
178
}
179
-
180
- if ( view . Length == 0 )
179
+ if ( length == 0 )
181
180
{
182
181
return "" ;
183
182
}
184
183
185
- var str = new string ( view ) ;
186
- Advance ( advanceLength ) ;
184
+ var byteCount = length * 2 ;
185
+ ref var src = ref GetSpanReference ( byteCount ) ;
186
+
187
+ var str = new string ( MemoryMarshal . CreateReadOnlySpan ( ref Unsafe . As < byte , char > ( ref src ) , length ) ) ;
188
+
189
+ Advance ( byteCount ) ;
187
190
188
191
return str ;
189
192
}
@@ -219,7 +222,7 @@ public void ReadObject<T>(scoped ref T? value)
219
222
return value ;
220
223
}
221
224
222
- #region ReadArray/Span(view)
225
+ #region ReadArray/Span
223
226
224
227
public T ? [ ] ? ReadArray < T > ( )
225
228
{
@@ -293,42 +296,10 @@ public void ReadSpan<T>(scoped ref Span<T?> value)
293
296
}
294
297
}
295
298
296
- //public void ReadSpan<T>(scoped ref Span<T?> value)
297
- //{
298
- // if (!RuntimeHelpers.IsReferenceOrContainsReferences<T>())
299
- // {
300
- // // DangerousReadUnmanaged(ref value);
301
- // // TODO:...?
302
- // throw new NotImplementedException();
303
- // }
304
-
305
- // if (!TryReadLengthHeader(out var length))
306
- // {
307
- // value = null;
308
- // return;
309
- // }
310
-
311
- // if (length == 0)
312
- // {
313
- // value = Array.Empty<T>();
314
- // return;
315
- // }
316
-
317
- // // T[] support overwrite
318
- // if (value == null || value.Length != length)
319
- // {
320
- // value = new T[length];
321
- // }
322
-
323
- // var formatter = MemoryPackFormatterProvider.GetFormatter<T>();
324
- // for (int i = 0; i < length; i++)
325
- // {
326
- // formatter.Deserialize(ref this, ref value[i]);
327
- // }
328
- //}
329
-
330
299
#endregion
331
300
301
+ #region UnmanagedArray/Span
302
+
332
303
public T [ ] ? ReadUnmanagedArray < T > ( )
333
304
where T : unmanaged
334
305
{
@@ -341,6 +312,12 @@ public void ReadUnmanagedArray<T>(scoped ref T[]? value)
341
312
DangerousReadUnmanagedArray < T > ( ref value ) ;
342
313
}
343
314
315
+ public void ReadUnmanagedSpan < T > ( scoped ref Span < T > value )
316
+ where T : unmanaged
317
+ {
318
+ DangerousReadUnmanagedSpan < T > ( ref value ) ;
319
+ }
320
+
344
321
// T: should be unamanged type
345
322
public unsafe T [ ] ? DangerousReadUnmanagedArray < T > ( )
346
323
{
@@ -374,18 +351,18 @@ public unsafe void DangerousReadUnmanagedArray<T>(scoped ref T[]? value)
374
351
return ;
375
352
}
376
353
377
- var size = length * Unsafe . SizeOf < T > ( ) ;
378
- ref var src = ref GetSpanReference ( size ) ;
354
+ var byteCount = length * Unsafe . SizeOf < T > ( ) ;
355
+ ref var src = ref GetSpanReference ( byteCount ) ;
379
356
380
357
if ( value == null || value . Length != length )
381
358
{
382
359
value = GC . AllocateUninitializedArray < T > ( length ) ;
383
360
}
384
361
385
362
ref var dest = ref Unsafe . As < T , byte > ( ref MemoryMarshal . GetArrayDataReference ( value ) ) ;
386
- Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) size ) ;
363
+ Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) byteCount ) ;
387
364
388
- Advance ( size ) ;
365
+ Advance ( byteCount ) ;
389
366
}
390
367
391
368
public unsafe void DangerousReadUnmanagedSpan < T > ( scoped ref Span < T > value )
@@ -402,48 +379,21 @@ public unsafe void DangerousReadUnmanagedSpan<T>(scoped ref Span<T> value)
402
379
return ;
403
380
}
404
381
405
- var size = length * Unsafe . SizeOf < T > ( ) ;
406
- ref var src = ref GetSpanReference ( size ) ;
382
+ var byteCount = length * Unsafe . SizeOf < T > ( ) ;
383
+ ref var src = ref GetSpanReference ( byteCount ) ;
407
384
408
385
if ( value == null || value . Length != length )
409
386
{
410
387
value = GC . AllocateUninitializedArray < T > ( length ) ;
411
388
}
412
389
413
390
ref var dest = ref Unsafe . As < T , byte > ( ref MemoryMarshal . GetReference ( value ) ) ;
414
- Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) size ) ;
415
-
416
- Advance ( size ) ;
417
- }
391
+ Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) byteCount ) ;
418
392
419
-
420
-
421
- // TODO:this?
422
-
423
- public bool TryReadUnmanagedSpan < T > ( out ReadOnlySpan < T > view , out int advanceLength )
424
- where T : unmanaged
425
- {
426
- return DangerousTryReadUnmanagedSpan ( out view , out advanceLength ) ;
427
- }
428
-
429
- // T: should be unamanged type
430
- public bool DangerousTryReadUnmanagedSpan < T > ( out ReadOnlySpan < T > view , out int advanceLength )
431
- {
432
- if ( ! TryReadCollectionHeader ( out var length ) )
433
- {
434
- view = default ;
435
- advanceLength = 0 ;
436
- return false ;
437
- }
438
-
439
- view = MemoryMarshal . CreateReadOnlySpan ( ref Unsafe . As < byte , T > ( ref GetSpanReference ( length ) ) , length ) ;
440
- advanceLength = view . Length * Unsafe . SizeOf < T > ( ) ;
441
- return true ;
393
+ Advance ( byteCount ) ;
442
394
}
443
395
444
-
445
-
446
-
396
+ #endregion
447
397
448
398
public void ReadSpanWithoutReadLengthHeader < T > ( int length , scoped ref Span < T ? > value )
449
399
{
@@ -460,12 +410,12 @@ public void ReadSpanWithoutReadLengthHeader<T>(int length, scoped ref Span<T?> v
460
410
value = GC . AllocateUninitializedArray < T > ( length ) ;
461
411
}
462
412
463
- var size = length * Unsafe . SizeOf < T > ( ) ;
464
- ref var src = ref GetSpanReference ( size ) ;
413
+ var byteCount = length * Unsafe . SizeOf < T > ( ) ;
414
+ ref var src = ref GetSpanReference ( byteCount ) ;
465
415
ref var dest = ref Unsafe . As < T , byte > ( ref MemoryMarshal . GetReference ( value ) ! ) ;
466
- Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) size ) ;
416
+ Unsafe . CopyBlockUnaligned ( ref dest , ref src , ( uint ) byteCount ) ;
467
417
468
- Advance ( size ) ;
418
+ Advance ( byteCount ) ;
469
419
}
470
420
else
471
421
{
0 commit comments