@@ -447,6 +447,66 @@ public unsafe void Test_MemoryExtensions_FromMemoryManager_CastFromByte_Pin(int
447447 Assert . IsTrue ( p1 == p2 ) ;
448448 }
449449
450+ [ TestCategory ( "MemoryExtensions" ) ]
451+ [ TestMethod ]
452+ public void Test_MemoryExtensions_FromString_CastFromByteAndBack ( )
453+ {
454+ var data = new string ( 'a' , 128 ) ;
455+ Memory < char > memoryOfChars = MemoryMarshal . AsMemory ( data . AsMemory ( ) ) ;
456+ Memory < float > memoryOfFloats = memoryOfChars . Cast < char , float > ( ) ;
457+ Memory < char > memoryBack = memoryOfFloats . Cast < float , char > ( ) ;
458+
459+ Assert . AreEqual ( memoryOfChars . Length , memoryBack . Length ) ;
460+
461+ Assert . IsTrue ( MemoryMarshal . TryGetString ( memoryOfChars , out var text , out int start , out int length ) ) ;
462+ Assert . AreSame ( text ! , data ) ;
463+ Assert . AreEqual ( start , 0 ) ;
464+ Assert . AreEqual ( length , data . Length ) ;
465+
466+ Assert . IsTrue ( memoryOfChars . Equals ( memoryBack ) ) ;
467+
468+ Span < char > span1 = memoryOfChars . Span ;
469+ Span < char > span2 = memoryBack . Span ;
470+
471+ Assert . IsTrue ( span1 == span2 ) ;
472+ }
473+
474+ [ TestCategory ( "MemoryExtensions" ) ]
475+ [ TestMethod ]
476+ [ DataRow ( 64 , 0 , 0 ) ]
477+ [ DataRow ( 64 , 4 , 0 ) ]
478+ [ DataRow ( 64 , 0 , 4 ) ]
479+ [ DataRow ( 64 , 4 , 4 ) ]
480+ [ DataRow ( 64 , 4 , 0 ) ]
481+ [ DataRow ( 256 , 16 , 0 ) ]
482+ [ DataRow ( 256 , 4 , 16 ) ]
483+ [ DataRow ( 256 , 64 , 0 ) ]
484+ [ DataRow ( 256 , 64 , 8 ) ]
485+ public unsafe void Test_MemoryExtensions_FromString_CastAndPin ( int size , int preOffset , int postOffset )
486+ {
487+ var data = new string ( 'a' , size ) ;
488+ Memory < char > memoryOfChars = MemoryMarshal . AsMemory ( data . AsMemory ( ) ) . Slice ( preOffset ) ;
489+ Memory < byte > memoryOfBytes = memoryOfChars . Cast < char , byte > ( ) . Slice ( postOffset ) ;
490+
491+ using ( var handle1 = memoryOfBytes . Pin ( ) )
492+ {
493+ void * p1 = handle1 . Pointer ;
494+ void * p2 = Unsafe . AsPointer ( ref data . DangerousGetReferenceAt ( preOffset + ( postOffset * sizeof ( byte ) / sizeof ( char ) ) ) ) ;
495+
496+ Assert . IsTrue ( p1 == p2 ) ;
497+ }
498+
499+ Memory < int > memoryOfInts = memoryOfChars . Cast < char , int > ( ) . Slice ( postOffset ) ;
500+
501+ using ( var handle2 = memoryOfInts . Pin ( ) )
502+ {
503+ void * p3 = handle2 . Pointer ;
504+ void * p4 = Unsafe . AsPointer ( ref data . DangerousGetReferenceAt ( preOffset + ( postOffset * sizeof ( int ) / sizeof ( char ) ) ) ) ;
505+
506+ Assert . IsTrue ( p3 == p4 ) ;
507+ }
508+ }
509+
450510 [ TestCategory ( "MemoryExtensions" ) ]
451511 [ TestMethod ]
452512 public void Test_MemoryExtensions_EmptyMemoryStream ( )
0 commit comments