11using Microsoft . CodeAnalysis ;
22using System ;
33using System . Collections . Generic ;
4+ using System . Reflection ;
45using System . Text ;
56
67namespace StackMemoryCollections
@@ -402,13 +403,18 @@ in Dictionary<string, TypeInfo> typeInfos
402403 if ( currentMember . AsPointer )
403404 currentMember . TypeName = typeof ( IntPtr ) . Name ;
404405
406+ WrapperPrimitiveGetPtr ( in builder , in currentMember , in typeInfo ) ;
405407 WrapperPrimitiveGetSet ( in builder , in currentMember , in typeInfo ) ;
406408 WrapperPrimitiveSetIn ( in builder , in currentMember , in typeInfo ) ;
407409 WrapperPrimitiveSetPtr ( in builder , in currentMember , in typeInfo ) ;
408410
409411 WrapperPrimitiveGetOut ( in builder , in currentMember , in typeInfo ) ;
410412
411413 currentMember . TypeName = memberType ;
414+ if ( currentMember . AsPointer )
415+ {
416+ WrapperGetValueInPtr ( in typeInfo , in currentMember , in builder , in typeInfos ) ;
417+ }
412418 }
413419 else
414420 {
@@ -417,6 +423,7 @@ in Dictionary<string, TypeInfo> typeInfos
417423 throw new Exception ( $ "{ nameof ( WrapperProperties ) } : Type information not found, types filling error. Type name: { currentMember . TypeName } ") ;
418424 }
419425
426+ WrapperСompositeGetPtr ( in builder , in currentMember , in typeInfo ) ;
420427 WrapperСompositeGetSet ( in builder , in currentMember , in memberTypeInfo , in typeInfo ) ;
421428 WrapperСompositeSetIn ( in builder , in currentMember , in memberTypeInfo , in typeInfo ) ;
422429 WrapperСompositeSetPtr ( in builder , in currentMember , in memberTypeInfo , in typeInfo ) ;
@@ -451,8 +458,7 @@ in StringBuilder builder
451458
452459 return result;
453460 }}
454-
455- " ) ;
461+ " ) ;
456462 }
457463 else
458464 {
@@ -463,10 +469,53 @@ in StringBuilder builder
463469 { typeInfo . ContainingNamespace } .{ typeInfo . TypeName } Helper.CopyToValue(in _start, ref result);
464470 return result;
465471 }}
466- ") ;
472+ " ) ;
467473 }
468474 }
469475
476+ private void WrapperGetValueInPtr (
477+ in TypeInfo containType ,
478+ in MemberInfo memberInfo ,
479+ in StringBuilder builder ,
480+ in Dictionary < string , TypeInfo > typeInfos
481+ )
482+ {
483+ if ( ! typeInfos . TryGetValue ( $ "{ memberInfo . TypeName } ", out var memberTypeInfo ) )
484+ {
485+ throw new Exception ( $ "{ nameof ( WrapperGetValueInPtr ) } : Type information not found, types filling error. Type name: { memberInfo . TypeName } ") ;
486+ }
487+
488+ builder . Append ( $@ "
489+ public { memberInfo . TypeName } { memberInfo . MemberName } ValueInPtr
490+ {{
491+ get
492+ {{
493+ " ) ;
494+ if ( ! containType . IsValueType )
495+ {
496+ builder . Append ( $@ "
497+ if (*((byte*)_start) == 0)
498+ {{
499+ throw new NullReferenceException(""ptr is null value"");
500+ }}
501+ " ) ;
502+ }
503+
504+ builder . Append ( $@ "
505+ var intPtr = { memberInfo . MemberName } ;
506+ if(intPtr == IntPtr.Zero)
507+ {{
508+ return null;
509+ }}
510+
511+ { memberTypeInfo . ContainingNamespace } .{ memberTypeInfo . TypeName } result = new { memberTypeInfo . TypeName } ();
512+ { memberTypeInfo . ContainingNamespace } .{ memberTypeInfo . TypeName } Helper.CopyToValue(intPtr.ToPointer(), ref result);
513+ return result;
514+ }}
515+ }}
516+ " ) ;
517+ }
518+
470519 private void WrapperFillValue (
471520 in TypeInfo typeInfo ,
472521 in StringBuilder builder
@@ -503,6 +552,23 @@ in TypeInfo containingType
503552" ) ;
504553 }
505554
555+ private void WrapperPrimitiveGetPtr (
556+ in StringBuilder builder ,
557+ in MemberInfo memberInfo ,
558+ in TypeInfo containingType
559+ )
560+ {
561+ builder . Append ( $@ "
562+ public { memberInfo . TypeName } * { memberInfo . MemberName } Ptr
563+ {{
564+ get
565+ {{
566+ return ({ memberInfo . TypeName } *){ containingType . ContainingNamespace } .{ containingType . TypeName } Helper.Get{ memberInfo . MemberName } Ptr(in _start);
567+ }}
568+ }}
569+ " ) ;
570+ }
571+
506572 private void WrapperPrimitiveSetIn (
507573 in StringBuilder builder ,
508574 in MemberInfo memberInfo ,
@@ -545,6 +611,23 @@ in TypeInfo containingType
545611" ) ;
546612 }
547613
614+ private void WrapperСompositeGetPtr (
615+ in StringBuilder builder ,
616+ in MemberInfo memberInfo ,
617+ in TypeInfo containingType
618+ )
619+ {
620+ builder . Append ( $@ "
621+ public void* { memberInfo . MemberName } Ptr
622+ {{
623+ get
624+ {{
625+ return { containingType . ContainingNamespace } .{ containingType . TypeName } Helper.Get{ memberInfo . MemberName } Ptr(in _start);
626+ }}
627+ }}
628+ " ) ;
629+ }
630+
548631 private void WrapperСompositeGetSet (
549632 in StringBuilder builder ,
550633 in MemberInfo memberInfo ,
0 commit comments