Skip to content

Commit 3aab8a9

Browse files
author
Vyacheslav
committed
feat:
+ wrapper getPtr property + wrapper ValueInPtrProperty + wrapper Fill and get value test #8 + wrapper GetPtr test #8
1 parent 1afa75c commit 3aab8a9

File tree

3 files changed

+186
-4
lines changed

3 files changed

+186
-4
lines changed

Src/StackMemoryCollections/GenerateWrappers.cs

Lines changed: 86 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.CodeAnalysis;
22
using System;
33
using System.Collections.Generic;
4+
using System.Reflection;
45
using System.Text;
56

67
namespace 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,

Src/Tests/HelperFixture.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using NUnit.Framework;
22
using System;
3-
using System.Runtime.CompilerServices;
43

54
namespace Tests
65
{

Src/Tests/WrapperFixture.cs

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
using NUnit.Framework;
2+
using System;
3+
4+
namespace Tests
5+
{
6+
[TestFixture]
7+
public class WrapperFixture
8+
{
9+
[Test]
10+
public void FillAndGetValueTest()
11+
{
12+
unsafe
13+
{
14+
var wrap2 = new Struct.HelpStructWrapper();
15+
var helpStructValueIn = new HelpStruct()
16+
{
17+
Int32 = 45,
18+
Int64 = 4564564564,
19+
HelpClass = new HelpClass()
20+
{
21+
Int32 = 12,
22+
Int64 = 321123,
23+
HelpStruct2 = new HelpStruct2(321, 98746512),
24+
HelpClass2 = new HelpClass()
25+
{
26+
Int32 = 238,
27+
Int64 = 40,
28+
HelpStruct2 = new HelpStruct2(1, 2)
29+
}
30+
}
31+
};
32+
wrap2.Fill(in helpStructValueIn);
33+
Assert.That(wrap2.HelpClass2, Is.EqualTo(IntPtr.Zero));
34+
Assert.That(wrap2.Int64, Is.EqualTo(4564564564));
35+
Assert.That(wrap2.Int32, Is.EqualTo(45));
36+
var helpClassValue = wrap2.HelpClass;
37+
var helpClassValue2 = wrap2.HelpClass;
38+
Assert.That(!Is.ReferenceEquals(helpClassValue, helpClassValue2));
39+
Assert.That(helpClassValue.Int32, Is.EqualTo(12));
40+
Assert.That(helpClassValue.Int64, Is.EqualTo(321123));
41+
Assert.That(helpClassValue.HelpStruct2, Is.EqualTo(new HelpStruct2(321, 98746512)));
42+
Assert.That(helpClassValue.HelpClass2, Is.EqualTo(null));
43+
44+
Assert.That(helpClassValue.Int32, Is.EqualTo(helpClassValue2.Int32));
45+
Assert.That(helpClassValue.Int64, Is.EqualTo(helpClassValue2.Int64));
46+
Assert.That(helpClassValue.HelpStruct2, Is.EqualTo(helpClassValue.HelpStruct2));
47+
Assert.That(helpClassValue.HelpClass2, Is.EqualTo(helpClassValue.HelpClass2));
48+
49+
var wrapClass = new Struct.HelpClassWrapper();
50+
wrapClass.Fill(new HelpClass(44, 235, new HelpStruct2(140, 78)));
51+
wrap2.HelpClass2 = new IntPtr(wrapClass.Ptr);
52+
Assert.That(wrap2.HelpClass2, Is.EqualTo(new IntPtr(wrapClass.Ptr)));
53+
var helpClass2Value = wrap2.HelpClass2ValueInPtr;
54+
Assert.That(helpClass2Value, Is.Not.EqualTo(null));
55+
Assert.That(helpClass2Value.Int32, Is.EqualTo(44));
56+
Assert.That(helpClass2Value.Int64, Is.EqualTo(235));
57+
Assert.That(helpClass2Value.HelpStruct2, Is.EqualTo(new HelpStruct2(140, 78)));
58+
Assert.That(helpClass2Value.HelpClass2, Is.EqualTo(null));
59+
60+
var helpStructValue = wrap2.GetValue();
61+
Assert.That(helpStructValue.Int64, Is.EqualTo(4564564564));
62+
Assert.That(helpStructValue.Int32, Is.EqualTo(45));
63+
Assert.That(helpStructValue.HelpClass.Int32, Is.EqualTo(12));
64+
Assert.That(helpStructValue.HelpClass.Int64, Is.EqualTo(321123));
65+
Assert.That(helpStructValue.HelpClass.HelpStruct2, Is.EqualTo(new HelpStruct2(321, 98746512)));
66+
67+
Assert.That(helpStructValue.HelpClass2, Is.Not.EqualTo(null));
68+
Assert.That(helpStructValue.HelpClass2.Int32, Is.EqualTo(44));
69+
Assert.That(helpStructValue.HelpClass2.Int64, Is.EqualTo(235));
70+
Assert.That(helpStructValue.HelpClass2.HelpStruct2, Is.EqualTo(new HelpStruct2(140, 78)));
71+
Assert.That(helpStructValue.HelpClass2.HelpClass2, Is.EqualTo(null));
72+
73+
wrapClass.Dispose();
74+
wrap2.Dispose();
75+
}
76+
}
77+
78+
[Test]
79+
public void GetPtrTest()
80+
{
81+
unsafe
82+
{
83+
var wrap2 = new Struct.HelpStructWrapper();
84+
var int64Ptr = wrap2.Int64Ptr;
85+
Assert.That(new IntPtr(int64Ptr), Is.EqualTo(new IntPtr((byte*)wrap2.Ptr + 0)));
86+
87+
var int32Ptr = wrap2.Int32Ptr;
88+
Assert.That(new IntPtr(int32Ptr), Is.EqualTo(new IntPtr((byte*)wrap2.Ptr + 8)));
89+
90+
var helpClassPtr = wrap2.HelpClassPtr;
91+
Assert.That(new IntPtr(helpClassPtr), Is.EqualTo(new IntPtr((byte*)wrap2.Ptr + 12)));
92+
93+
var helpClass2Ptr = wrap2.HelpClass2Ptr;
94+
Assert.That(new IntPtr(helpClass2Ptr), Is.EqualTo(new IntPtr((byte*)wrap2.Ptr + 12 + HelpClassHelper.SizeOf)));
95+
96+
wrap2.Dispose();
97+
}
98+
}
99+
}
100+
}

0 commit comments

Comments
 (0)