Skip to content

Commit bfc609d

Browse files
committed
Added merge and clone operation for metadata, fixed reference behavior for metadata, patches can now modify metadata.
1 parent a3fabbe commit bfc609d

File tree

8 files changed

+91
-4
lines changed

8 files changed

+91
-4
lines changed

HexaGen.Runtime/HexaGen.Runtime.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<RepositoryUrl>https://github.com/JunaMeinhold/HexaGen</RepositoryUrl>
1212

1313
<AssemblyVersion>1.1.0</AssemblyVersion>
14-
<PackageVersion>1.1.8</PackageVersion>
14+
<PackageVersion>1.1.9</PackageVersion>
1515
<Description>The C Runtime for all C Wrappers generated with the HexaGen Code Generator.</Description>
1616
<Authors>Juna Meinhold</Authors>
1717
<PackageProjectUrl>https://github.com/JunaMeinhold/HexaGen</PackageProjectUrl>

HexaGen.Runtime/LibraryLoader.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,37 @@ public static nint LoadLibrary()
183183
return handle;
184184
}
185185

186+
public delegate string LibraryNameCallback();
187+
188+
public delegate string LibraryExtensionCallback();
189+
190+
public static nint LoadLibrary(LibraryNameCallback libraryNameCallback, LibraryExtensionCallback? libraryExtensionCallback)
191+
{
192+
var libraryName = libraryNameCallback();
193+
194+
var extension = libraryExtensionCallback != null ? libraryExtensionCallback() : GetExtension([]);
195+
196+
if (!libraryName.EndsWith(extension, StringComparison.OrdinalIgnoreCase))
197+
{
198+
libraryName += extension;
199+
}
200+
201+
var osPlatform = GetOSPlatform();
202+
var architecture = GetArchitecture();
203+
var libraryPath = GetNativeAssemblyPath(osPlatform, architecture, libraryName);
204+
205+
nint handle;
206+
207+
handle = NativeLibrary.Load(libraryPath);
208+
209+
if (handle == IntPtr.Zero)
210+
{
211+
throw new DllNotFoundException($"Unable to load library '{libraryName}'.");
212+
}
213+
214+
return handle;
215+
}
216+
186217
private static string GetNativeAssemblyPath(string osPlatform, string architecture, string libraryName)
187218
{
188219
#if ANDROID

HexaGen/CsCodeGenerator.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public partial class CsCodeGenerator : BaseGenerator
1212
protected FunctionGenerator funcGen;
1313
protected PatchEngine patchEngine = new();
1414
protected ConfigComposer configComposer = new();
15+
private CsCodeGeneratorMetadata? metadata;
1516

1617
public static CsCodeGenerator Create(string configPath)
1718
{
@@ -268,8 +269,12 @@ public void LoadMetadata(string path)
268269

269270
public CsCodeGeneratorMetadata GetMetadata()
270271
{
271-
CsCodeGeneratorMetadata metadata = new();
272-
metadata.CopyFrom(this);
272+
if (metadata == null)
273+
{
274+
metadata = new();
275+
metadata.CopyFrom(this);
276+
}
277+
273278
return metadata;
274279
}
275280

HexaGen/HexaGen.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
88

99
<AssemblyVersion>1.1.1</AssemblyVersion>
10-
<PackageVersion>1.1.5</PackageVersion>
10+
<PackageVersion>1.1.6</PackageVersion>
1111
<Description></Description>
1212
<PackageTags></PackageTags>
1313
<Authors>Juna Meinhold</Authors>

HexaGen/Metadata/CsCodeGeneratorMetadata.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,41 @@ public void CopyFrom(CsCodeGenerator generator)
3838
VTableLength = generator.VTableLength;
3939
}
4040

41+
public void Merge(CsCodeGeneratorMetadata from, bool copyFnTableLen)
42+
{
43+
DefinedConstants.AddRange(from.DefinedConstants);
44+
DefinedEnums.AddRange(from.DefinedEnums);
45+
DefinedExtensions.AddRange(from.DefinedExtensions);
46+
DefinedFunctions.AddRange(from.DefinedFunctions);
47+
DefinedTypedefs.AddRange(from.DefinedTypedefs);
48+
DefinedTypes.AddRange(from.DefinedTypes);
49+
DefinedDelegates.AddRange(from.DefinedDelegates);
50+
Copy(from.WrappedPointers, WrappedPointers);
51+
if (copyFnTableLen)
52+
{
53+
VTableLength = from.VTableLength;
54+
}
55+
}
56+
57+
public CsCodeGeneratorMetadata Clone()
58+
{
59+
var clonedMetadata = new CsCodeGeneratorMetadata
60+
{
61+
Settings = Settings,
62+
DefinedConstants = DefinedConstants.Select(constant => constant.Clone()).ToList(),
63+
DefinedEnums = DefinedEnums.Select(enumItem => enumItem.Clone()).ToList(),
64+
DefinedExtensions = new List<string>(DefinedExtensions),
65+
DefinedFunctions = new List<string>(DefinedFunctions),
66+
DefinedTypedefs = new List<string>(DefinedTypedefs),
67+
DefinedTypes = new List<string>(DefinedTypes),
68+
DefinedDelegates = new List<string>(DefinedDelegates),
69+
WrappedPointers = new Dictionary<string, string>(WrappedPointers),
70+
VTableLength = VTableLength
71+
};
72+
73+
return clonedMetadata;
74+
}
75+
4176
public static void Copy<TKey, TValue>(Dictionary<TKey, TValue> source, Dictionary<TKey, TValue> destination) where TKey : notnull
4277
{
4378
foreach (var item in source)

HexaGen/Metadata/CsConstantMetadata.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,10 @@ public override string ToString()
4343
{
4444
return $"Constant: {CppName} = {CppValue}";
4545
}
46+
47+
public CsConstantMetadata Clone()
48+
{
49+
return new CsConstantMetadata(CppName, CppValue, Name, Value, Comment);
50+
}
4651
}
4752
}

HexaGen/Metadata/CsEnumItemMetadata.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,10 @@ public override int GetHashCode()
4040
{
4141
return Identifier.GetHashCode();
4242
}
43+
44+
public CsEnumItemMetadata Clone()
45+
{
46+
return new CsEnumItemMetadata(CppName, CppValue, Name, Value, new List<string>(Attributes), Comment);
47+
}
4348
}
4449
}

HexaGen/Metadata/CsEnumMetadata.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,11 @@ public override int GetHashCode()
5454
{
5555
return Identifier.GetHashCode();
5656
}
57+
58+
public CsEnumMetadata Clone()
59+
{
60+
return new CsEnumMetadata(CppName, Name, new List<string>(Attributes), Comment, BaseType, Items.Select(item => item.Clone()).ToList()
61+
);
62+
}
5763
}
5864
}

0 commit comments

Comments
 (0)