Skip to content

Commit 3aef8a0

Browse files
author
Vyacheslav
committed
feat: Get and fill method to make a deep copy
1 parent 9afba0b commit 3aef8a0

File tree

2 files changed

+82
-8
lines changed

2 files changed

+82
-8
lines changed

Src/StackMemoryCollections/GenerateHelpers.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,17 @@ in MemberInfo memberInfo
213213
");
214214
return;
215215
}
216-
217-
builder.Append($@"
216+
else
217+
{
218+
builder.Append($@"
218219
public static {memberInfo.TypeName} Get{memberInfo.MemberName}Value(in void* ptr)
219220
{{
220221
{memberInfo.TypeName} result = new {memberInfo.TypeName}();
221222
{memberInfo.TypeName}Helper.CopyToValue((byte*)ptr + {memberInfo.Offset}, ref result);
222223
return result;
223224
}}
224225
");
226+
}
225227
}
226228

227229
private void GenerateSetСompositeValueFrom(
@@ -292,22 +294,43 @@ private void GenerateCopyToValueOut(
292294
in INamedTypeSymbol currentType
293295
)
294296
{
295-
builder.Append($@"
297+
if (typeInfo.IsValueType)
298+
{
299+
builder.Append($@"
300+
[SkipLocalsInit]
296301
public static void CopyToValueOut(in void* ptr, out {currentType.Name} value)
297302
{{
298-
value = new {currentType.Name}();
303+
Unsafe.SkipInit(out value);
299304
");
300-
foreach (var memberInfo in typeInfo.Members)
305+
foreach (var memberInfo in typeInfo.Members)
306+
{
307+
builder.Append($@"
308+
value.{memberInfo.MemberName} = Get{memberInfo.MemberName}Value(in ptr);
309+
");
310+
}
311+
312+
builder.Append($@"
313+
}}
314+
");
315+
}
316+
else
301317
{
302318
builder.Append($@"
319+
public static void CopyToValueOut(in void* ptr, out {currentType.Name} value)
320+
{{
321+
value = new {currentType.Name}();
322+
");
323+
foreach (var memberInfo in typeInfo.Members)
324+
{
325+
builder.Append($@"
303326
value.{memberInfo.MemberName} = Get{memberInfo.MemberName}Value(in ptr);
304327
");
305-
}
328+
}
306329

307-
builder.Append($@"
330+
builder.Append($@"
308331
}}
309-
310332
");
333+
}
311334
}
312335

313336
private void GenerateCopy(

Src/StackMemoryCollections/GenerateWrappers.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Linq;
5+
using System.Reflection;
56
using System.Text;
67

78
namespace StackMemoryCollections
@@ -67,6 +68,7 @@ in string wrapperNamespace
6768
6869
using System;
6970
using {currentType.ContainingNamespace};
71+
using System.Runtime.CompilerServices;
7072
7173
namespace {currentType.ContainingNamespace}.{wrapperNamespace}
7274
{{
@@ -253,6 +255,8 @@ in Dictionary<string, TypeInfo> typeInfos
253255
{
254256
WrapperPtr(in builder);
255257
PrimitiveWrapperChangePtr(in builder);
258+
WrapperGetValue(in typeInfo, in builder);
259+
WrapperFillValue(in typeInfo, in builder);
256260

257261
for (int i = 0; i < typeInfo.Members.Count; i++)
258262
{
@@ -289,6 +293,53 @@ in StringBuilder builder
289293
");
290294
}
291295

296+
private void WrapperGetValue(
297+
in TypeInfo typeInfo,
298+
in StringBuilder builder
299+
)
300+
{
301+
if(typeInfo.IsValueType)
302+
{
303+
builder.Append($@"
304+
[SkipLocalsInit]
305+
public {typeInfo.TypeName} GetValue()
306+
{{
307+
{typeInfo.ContainingNamespace}.{typeInfo.TypeName} result;
308+
Unsafe.SkipInit(out result);
309+
{typeInfo.ContainingNamespace}.{typeInfo.TypeName}Helper.CopyToValue(in _start, ref result);
310+
311+
return result;
312+
}}
313+
314+
");
315+
}
316+
else
317+
{
318+
builder.Append($@"
319+
public {typeInfo.TypeName} GetValue()
320+
{{
321+
{typeInfo.ContainingNamespace}.{typeInfo.TypeName} result = new {typeInfo.TypeName}();
322+
{typeInfo.ContainingNamespace}.{typeInfo.TypeName}Helper.CopyToValue(in _start, ref result);
323+
return result;
324+
}}
325+
");
326+
}
327+
}
328+
329+
private void WrapperFillValue(
330+
in TypeInfo typeInfo,
331+
in StringBuilder builder
332+
)
333+
{
334+
builder.Append($@"
335+
public void Fill(in {typeInfo.TypeName} value)
336+
{{
337+
{typeInfo.TypeName}Helper.CopyToPtr(in value, in _start);
338+
}}
339+
340+
");
341+
}
342+
292343
private void WrapperPrimitiveGetSet(
293344
in StringBuilder builder,
294345
in MemberInfo memberInfo,

0 commit comments

Comments
 (0)